ChanServ changed the topic of #libreoffice-ru to: Канал поддержки русскоязычных пользователей LibreOffice | Wiki TDF http://tdf.io/wikiru | On-line документация http://tdf.io/helpru | Логи канала: http://goo.gl/gzwdwU
JohnDoe_71Rus has joined #libreoffice-ru
tagezi_ has joined #libreoffice-ru
tagezi has quit [Ping timeout: 265 seconds]
JohnDoe_71Rus has quit [Quit: KVIrc 4.9.3 Aria http://www.kvirc.net/]
JohnDoe_71Rus has joined #libreoffice-ru
kompi has joined #libreoffice-ru
<kompi> mikekaganski: https://i.imgur.com/Mtn0WMf.png
<kompi> mikekaganski: посмотри на путь до библиотеки
<kompi> не от того ли либра на винде спотыкается при установке, что путь длиннее 255 символов?
<mikekaganski> где ж он длиннее?
<kompi> а разве нет?
<mikekaganski> нет
<kompi> ок, то есть это нормально, что в такую опу прячется файл?
<mikekaganski> 131 символ
<mikekaganski> нормально
<kompi> ладно бог с ним
<kompi> мне просто показалось, что это не очень правильно в принципе, такой путь делать для установленных расширений
<mikekaganski> Ну, для начала: пользователь устанавливает расширения в свой профиль. Он у тебя в c:\users\YourName\AppData\Roaming\LibreOffice\4\user - и это нормально.
<kompi> это да
<kompi> а дальше?
<mikekaganski> Внутри него путь uno_packages/ - нормально. А внутри распакованное расширение (изначально-то оно в архиве) - в папке cache с подпапками для возможности параллельного хранения нескольких версий на случай необходимости
<kompi> хм
<kompi> короче
<kompi> mikekaganski: ты готов дальше мне забивать моск?
<mikekaganski> :)
* kompi вчера почитал таки Питоньяка и понял, какого Х переменная i объявляется с %
<kompi> это просто INTEGER >_<
<kompi> сокращенно
<mikekaganski> да
<kompi> mikekaganski: вчера мы остановились на том, что все работает, но ни фига не делает, потому что нет объектов
<mikekaganski> теперь нам нужно, чтобы GetObjectsFromDoc делала какую-то реальную работу и наполняла объектами массив
<kompi> ну как бы да
<mikekaganski> и здесь нужно обратить внимание на важное различие между модулями
<kompi> сначала надо прочекать модуль
<mikekaganski> Во всех модулях встроенные объекты располагаются на специальных "листах", называемых DrawPage
<mikekaganski> Но в Calc, Draw и Impress каждый документ содержит несколько таких листов
<mikekaganski> а в Writer существует только один такой лист
<mikekaganski> и доступ к этим листам осуществляется по-разному
<mikekaganski> в Calc-Draw-Impress есть коллекция листов, которую мы перебираем и по одному работаем с отдельными листами
<mikekaganski> а в writer коллекции нет, а есть доступ сразу к единственному листу
<kompi> примем за аксиому
<mikekaganski> На самом деле я думаю это исправить: добавить в writer тоже коллекцию. Ну и пусть она будет с единственным листом, зато можно будет упростить работу из скриптов. Но это пока прожект
<mikekaganski> поэтому нам нужно иметь возможность по-разному обрабатывать разные типы документов
<kompi> ты сломаешь существующие макросы тогда
<mikekaganski> нет
<mikekaganski> ничего не мешает иметь и прямой доступ к листу, и коллекцию одновременно
<kompi> ладно, мы отклоняемся
<kompi> аа
<mikekaganski> В StarBasic есть базовый механизм работы с UNO-объектами, которыми являются все объекты ЛО, с которыми ты имеешь дело в скрипте
<mikekaganski> например, oDoc или oDialog - это UNO-объекты
<mikekaganski> так вот, каждый такой объект реализует какой-то набор интерфейсов, каждый из которых имеет название, и каждый из них предоставляет какие-то функции и свойства
<kompi> угу
<mikekaganski> Например, когда ты пишешь что-то наподобие oSel = oDoc.CurrentSelection, ты обращаешься к свойству CurrentSelection интерфейса XSelectionSupplier
<mikekaganski> И это обращение возможно только из-за того, что oDoc реализует такой интерфейс
<mikekaganski> по-хорошему стоило бы предварительно проверить, так ли это, но мы знаем, что все объекты-документы ЛО реализуют его, так что мы просто обращаемся к выделению без проверки
<mikekaganski> А вот доступ к графической странице или к коллекции графических страниц реализуется другими интерфейсами, и их реализацию мы как раз и будем проверять
<mikekaganski> Итак, начнём с Writer
<mikekaganski> функция проверки интерфейса - HasUnoInterfaces
<kompi> перерыв на 10 мин, сын домогается
<kompi> mikekaganski: тут
<mikekaganski> и нам нужно будет удостовериться, что документ поддерживает интерфейс "com.sun.star.drawing.XDrawPageSupplier"
<mikekaganski> Итак: на данный момент GetObjectsFromDoc делает два действия: создаёт пустой массив, и возвращает его в виде результата
<kompi> погоди
<mikekaganski> между этими двумя действиями мы вставим проверку
<mikekaganski> ок
<kompi> ты же сказал, что все документы имеют drawpage
<mikekaganski> нет, либо DrawPage, либо коллекцию DrawPages, внутри которой уже будут DrawPage
<kompi> тогда что означает вышеприведенный интерфейс?
<mikekaganski> этот интерфейс - это как раз и есть доступ к графической странице
<kompi> эм
<kompi> это я понял, я не понял зачем мы его проверяем на наличие
<mikekaganski> а у других модулей будет "com.sun.star.drawing.XDrawPagesSupplier"
<kompi> ааа
<mikekaganski> обрати внимание на Page - Pages
<kompi> да увидел
<kompi> то есть это Writer специфичный
<mikekaganski> Ну, именно у документа - да
<kompi> ок
<mikekaganski> дальше?
<kompi> да
<mikekaganski> насчёт двух действий в GetObjectsFromDoc - норм?
<kompi> в каком плане?
<mikekaganski> вопросов нет?
<kompi> проверяем наличие интерфейса и создаем массив объектов?
<mikekaganski> Так вот, после создания пустого массива, но перед его возвратом мы вставим проверку интерфейса и действия в случае, если интерфейс поддерживается
<mikekaganski> да
<kompi> да ок
<mikekaganski> Получатся три дополнительные строки:
<mikekaganski> If (HasUnoInterfaces(oDoc, "com.sun.star.drawing.XDrawPageSupplier")) Then
<mikekaganski> vObjects = GetObjectsFromDrawPage(oDoc.DrawPage, oSel)
<mikekaganski> End If
<kompi> после пустого массива?
<mikekaganski> да
<kompi> есть
<mikekaganski> Теперь нужно создать этот самый GetObjectsFromDrawPage
<kompi> нужно
<kompi> mikekaganski: но есть проблемы?
<mikekaganski> сорри, отвлекался
<mikekaganski> итак, создаём функцию GetObjectsFromDrawPage, которая во многом будет выполнять то, что мы убрали из Formatting вчера
<mikekaganski> Function GetObjectsFromDrawPage(ByRef oDrawPage, ByRef oSel) ... End Function
<kompi> нет проблем, конечно
<mikekaganski> вспомним это: https://paste.ubuntu.com/26332365/
<mikekaganski> Наша последняя функция будет возвращать массив объектов. Поэтому начнём её с создания пустого массива (аналогично GetObjectsFromDoc )
<mikekaganski> Dim vObjects() As Object
<mikekaganski> а закончим - опять-таки аналогично - возвратом этого массива: GetObjectsFromDrawPage = vObjects
<kompi> угу
<mikekaganski> А вот между ними вставим перебор объектов на графической странице
<mikekaganski> Мы это будем делать только если там вообще есть объекты
<mikekaganski> поэтому: If (oDrawPage.Count > 0) Then ... End If
<kompi> разве может быть графическая страница без объектов?
<mikekaganski> а почему нет?
<mikekaganski> вначале так и есть
<mikekaganski> код, возвращающий графическую страницу, создаёт её при необходимости (пустую)
<kompi> ок, примем за ксиому №2
<kompi> далее
<mikekaganski> Когда мы увидели, что хоть какие-то объекты есть, мы превратим наш массив из пустого (состоящего из НУЛЯ объектов) в массив из стольких объектов, сколько на странице
<mikekaganski> (сами эти объекты пока пустые, но массив уже непустой)
<mikekaganski> ReDim vObjects(0 To oDrawPage.Count-1)
<kompi> это где?
<kompi> в условии?
* kompi потерял логику
<mikekaganski> "как только мы увидели, что хоть какие-то объекты есть"
<mikekaganski> то есть да, если число объектов больше нуля
<mikekaganski> Пройдёмся по объектам:
<mikekaganski> Dim i As Long
<mikekaganski> ...
<mikekaganski> Dim oObj As Object
<mikekaganski> oObj=oDrawPage(i)
<mikekaganski> For i = 0 to oDrawPage.Count-1
<mikekaganski> Next i
<mikekaganski> ух
<mikekaganski> он неправильно отправляет
<kompi> он?=)
<mikekaganski> клиент IRC
<mikekaganski> Это просто цикл, перебирающий объекты. Похожий на то, что у нас было в Formatting
<mikekaganski> Продолжим добавлять сходство
<mikekaganski> вместо многоточия вставим код, проверяющий, что это подходящий объект, и собственно добавляющий объект в массив
<mikekaganski> Правда, тут мы берём не getEmbeddedObject, а Model, но суть не меняется
<mikekaganski> у этого есть причина. Для наших формул и Model, и EmbeddedObject указывают на одно и то же. Поэтому без разницы, что использовать. А вот когда мы перейдём к кальку сотоварищи, окажется, что там нет EmbeddedObject
<mikekaganski> так что я тут заранее заменил обращение к EmbeddedObject на совместимую Model
<mikekaganski> ку?
<kompi> аа, я тут, все ок
<mikekaganski> я переспрашиваю, чтобы знать, что всё понятно
<kompi> мне казалось, что я даю какие-то звуки в ответ=(
<mikekaganski> :)
<kompi> дай каммент вот на что
<mikekaganski> ?
<kompi> 1. проверка, что объекты вообще есть
<mikekaganski> не правильно
<kompi> хм
<mikekaganski> строка 5 должна идти после строки 15
<mikekaganski> мы всё это делаем только внутри ифа, т.е. только если есть объекты
<kompi> эээ
<mikekaganski> на самом деле твой код, как ни странно, тоже будет работать, поскольку твой цикл не отработает ни разу, если объектов нет. Но просто такая структура нелогична
<kompi> это не мой код, я в данном случае - обезьяна
<kompi> дорасту до уровня Леры, тогда будет мой код
<kompi> mikekaganski: код такой? если да, то по поводу логики:
<mikekaganski> всё так, жду коммент
<kompi> так вот
<kompi> хм
<kompi> если объекты вообще есть, то мы начинаем их перебор на предмет соответствия типу "формула" и наполняем ими массив?
<mikekaganski> нет, не формула
<mikekaganski> а "встроенный объект"
<kompi> любой объект?
<mikekaganski> на предмет формулистости уже проверяет formatting
<mikekaganski> Тут многослойный пирог
<kompi> то есть тут мы просто набираем массив объектов, если таковые есть
<mikekaganski> на странице есть объект - это может быть линия, или круг, или встроенный объект
<kompi> любых
<kompi> что делает ReDim?
<kompi> почему оно без уазания типа?
<mikekaganski> погодь
<mikekaganski> если это встроенный объект, то у него внутри есть ссылка на реальный объект
<mikekaganski> это может быть формула, а может быть рисунок автокада
<kompi> хм
<kompi> а если это картинка?
<mikekaganski> так вот, мы делаем первый уровень фильтрации здесь - проверяем, что объект - это тот самый встроенный объект - и в массив тогда вставляем не его, а реальный объект, который сидит внутри
<mikekaganski> ну, может оказаться и картинка
<kompi> встроенная в документ картинка PNG
<mikekaganski> уже внутри formatting мы проверяем, что реальный объект - это формула
<mikekaganski> можно и второй уровень сюда перенести на самом деле
<kompi> 'v&
<kompi> второй - проверка на "формульность"?
<mikekaganski> да
<kompi> погоди, насчет "реального объекта"
<mikekaganski> я разделил уровни сначала, т.к. не был уверен, что первый уровень будет одинаковым для разных модулей
<mikekaganski> годю
<kompi> мы же не сам объект пихаем в массив, а только ссылку на него...или как?
<mikekaganski> ну да
<kompi> хм
<kompi> ладно
<mikekaganski> Давай уже всё сюда запихнём
<kompi> поехали далее
<kompi> точно?
<mikekaganski> точно
<kompi> давай
<mikekaganski> к твоему вопросу
<mikekaganski> Dim vObjects() As Object создал массив с нулём объектов
<mikekaganski> тип уже есть
<mikekaganski> ReDim меняет количество элементов массива, но не меняет тип
<mikekaganski> Если бы мы не сделали ReDim, то получили бы ошибку, как только попытались бы что-то запихнуть в vObjects(0)
<mikekaganski> поскольку мы пытались бы обратиться к элементу, которого нет
<mikekaganski> на самом деле можно обойтись без этого и упростить алгоритм за счёт выделения массива на 1 больше, чем надо
<kompi> хм
<kompi> а надо?
<mikekaganski> смотри сам
<kompi> строку сэкономили
<kompi> ладно, пусть с "упрощением "
<mikekaganski> ну, три (две, если учитывать комментарий)
<mikekaganski> Итак, на выходе у нас массив с некоторым числом элементов, некоторые из них - пустые, а остальные - это точно формулы
<mikekaganski> так?
<kompi> почему некоторые пустые?
<mikekaganski> :)
<mikekaganski> посмотри внимательно.
<mikekaganski> Примем, что у нас на странице 500 объектов, из них 50 формул, 50 растров и 400 линий
<kompi> ну
<mikekaganski> 400 линий отсекутся на первой проверке
<mikekaganski> 50 растров - на второй
<mikekaganski> и только 50 объектов мы запишем
<kompi> это ясно
<kompi> я спросил "почему пустые"
<mikekaganski> но массив-то мы вначале сделали на 501 объект!
<kompi> хм
<mikekaganski> то есть 451 позиция останется пустой
<kompi> не востребованной?
<mikekaganski> (в первом варианте было бы "на 500" и "450", но это неважно)
<mikekaganski> там будет значение "Пустой объект"
<mikekaganski> Nothing
<mikekaganski> это специальный объект, который проверяется с помощью IsNull(obj)
<kompi> ок
<mikekaganski> когда ты создаёшь массив из N элементов, все эти элементы сразу чем-то заполнены. Если это массив чисел, там будут нули
<mikekaganski> а если это массив объектов, там будут Nothing везде
<mikekaganski> Можно было бы заморочиться и убрать здесь лишние пустоты, но это совершенно лишнее
<mikekaganski> поэтому так и отправим пустоты в Formmatting
<mikekaganski> просто там оставим одну проверку на IsNull
<mikekaganski> Нам осталось только проверить, что Formatting у нас нормальная
<mikekaganski> отправь свой текущий вариант
<kompi> ох, не нормальная она
<mikekaganski> да, не нормальная :)
<mikekaganski> Во-первых, Obj1=vObjects(i).getEmbeddedObject неверно, поскольку мы уже получили реальный объект раньше, и в массиве именно он
<mikekaganski> заменяем его на Obj1=vObjects(i)
<mikekaganski> Во-вторых, проверка на If Obj1.supportsService("com.sun.star.formula.FormulaProperties") then теперь лишняя, т.к. мы обеспечили это условие для всех непустых объектов ранее
<mikekaganski> убираем её (и соответственно, строку 37)
<mikekaganski> в общем-то, теперь всё (ну, если не обращать внимание на форматирование отступов :))
<kompi> угу
<mikekaganski> Вот как она выглядит у меня (там старые названия, так что напрямую ты её не сможешь использовать, отправляю просто для посмотреть): https://pastebin.ca/3956385
<kompi> и чего же мы добились на настоящем этапе?
<mikekaganski> вернули функционал
<kompi> лчше я покажу, как у меня
<mikekaganski> ок
<mikekaganski> норм
<kompi> mikekaganski: ошибка oDialog не определен
<mikekaganski> должно работать
<mikekaganski> где?
<mikekaganski> покажи ошибку
<kompi> эээ
<kompi> О_О
<kompi> либра молча пропала
<mikekaganski> kompi: а куда ты дел BasicLibraries.LoadLibrary("Tools")
<kompi> Я?
<mikekaganski> ты
<kompi> а она была аще?
<mikekaganski> можешь глянуть историю - эту строку мы не трогали
<mikekaganski> она была перед загрузкой диалога
<mikekaganski> BasicLibraries.LoadLibrary("Tools")
<mikekaganski> Dim oDialog As Object
<mikekaganski> oDialog = LoadDialog("FAF", "FaF")
<kompi> никогда там ее не было
<mikekaganski> прааавда?
<kompi> mikekaganski: https://i.imgur.com/0oZ0Qxq.png
<mikekaganski> я вот сейчас специально скачаю твоё расширение с форума
<kompi> mikekaganski: там была глобальная переменная, а мы ее снесли, не было тоолса
<kompi> ну хз
<kompi> mikekaganski: ты смотри вторую ошибку
<mikekaganski> А ты внимательно смотрел мой листинг? https://pastebin.ca/3956377
<mikekaganski> см. строку 5
<kompi> так я и копировал все целиком
<mikekaganski> ох
<mikekaganski> и в этой, и в следующей строках должна быть oObj1
<mikekaganski> сорри
<kompi> а?
<mikekaganski> Мой косяк. Но ты должен уже мочь это увидеть и исправить сам
<kompi> так она и есть с 1
<mikekaganski> буквочка o
<kompi> ничего не делает
<kompi> ошибок нет, но и неделает ничего
<mikekaganski> на всякий случай: ты в обеих строчках сделал именно oObj1 , с единичкой?
<kompi> а ты гришь "твой код" =(
<kompi> афк
kompi has quit [Quit: Page closed]
JohnDoe_71Rus has quit [Quit: KVIrc 4.9.3 Aria http://www.kvirc.net/]