Переменные модели
Напомню, как выглядит настройка наших динамических компонентов (стройматериалов):
Каждая из переменных - формула. Например:
Полный список формул - выглядит так:
L (длина)=LenX/100 (приводим к метрам, LenX - берется из модели, для каждой конкретной доски)
V (объем)=L*0.1*0.05
М (масса)=V*600
С (цена)=V*19000
Для листовых, добавляется переменная площади
Для штучных еще одна переменная
Выгрузка переменных.
("мелкими буквами", для пользователей "пролеченного" скеча. Перед генерацией отчета, он лезет на сайт за проверкой лицензии. Можно перенаправить на другой хост, проще, перед генерацией, просто отключить доступ к инету любым способом, от отключения роутера, либо адаптера, до выдергивания сетевого шнурка)
Тыкаем в меню File - Generate Report, получаем формочку:
(опять мелкими буковками: - после появления этой формы, включаем инет)
Выбираем "Все атрибуты модели", жмем генерировать CSV.
Если окошко сохранения появится не сразу, не переживайте, слабенькие компы будут собирать параметры до пары минут, нужно просто подождать.
Дальше - понадобится LibreOffice (использовать МS Office - означает финансировать войну в Ираке). Скечап предложит сразу открыть сохраненный файлик, соглашаемся.
Нас интересуют колнки с О и далее (там наши переменные). Дальше, по сути все сводится к удалению лишних колонок, сортировкам, преобразованиям текста в числа, промежуточным итогам и т.д. К форматированию. Т.к. делать это придется неоднократно - накидал макрос.
После его запуска, будет две таблички:
Сборка по слоям с промежуточными итогами по каждому слою (удобно собирать нагрузки)
Смета. Промежуточные итоги по каждому материалу (динамическому компоненту Скеча), количество, суммы, масса...
Как разрешать макросы и добавлять новые в Либре - в инете много, думаю, что расписывать смысла нет. Если не найдете, распишу.
Текст макроса вставляем полностью, начиная с "sub FormatReportSketchUp", заканчивая "End Sub".
Что там для чего - вроде в комментах расписал подробно, надеюсь, будет понятно. Дальше, сам текст макроса:
sub FormatReportSketchUp
rem ----------------------------------------------------------------------
rem Рисуем диспетчера
dim document as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem присобачиваем диспетчера к доку
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem ----------------------------------------------------------------------
rem удаляем лишние колонки
dim args(0) as new com.sun.star.beans.PropertyValue
args(0).Name = "ToPoint"
args(0).Value = "$G$1"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args())
dispatcher.executeDispatch(document, ".uno:DeleteColumns", "", , Array())
dispatcher.executeDispatch(document, ".uno:DeleteColumns", "", , Array())
dispatcher.executeDispatch(document, ".uno:DeleteColumns", "", , Array())
dispatcher.executeDispatch(document, ".uno:DeleteColumns", "", , Array())
dispatcher.executeDispatch(document, ".uno:DeleteColumns", "", , Array())
dispatcher.executeDispatch(document, ".uno:DeleteColumns", "", , Array())
dispatcher.executeDispatch(document, ".uno:DeleteColumns", "", , Array())
dispatcher.executeDispatch(document, ".uno:DeleteColumns", "", , Array())
args(0).Value = "$A$1"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args())
dispatcher.executeDispatch(document, ".uno:DeleteColumns", "", , Array())
dispatcher.executeDispatch(document, ".uno:DeleteColumns", "", , Array())
dispatcher.executeDispatch(document, ".uno:DeleteColumns", "", , Array())
dispatcher.executeDispatch(document, ".uno:DeleteColumns", "", , Array())
rem ----------------------------------------------------------------------
rem меняем колонки местами (слой/компонент)
args(0).Value = "$A$1"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args())
dispatcher.executeDispatch(document, ".uno:InsertColumns", "", 0, Array())
args(0).Value = "$C$1"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args())
dispatcher.executeDispatch(document, ".uno:SelectColumn", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
args(0).Value = "$A$1"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args())
dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())
args(0).Value = "$C$1"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args())
dispatcher.executeDispatch(document, ".uno:DeleteColumns", "", 0, Array())
rem ----------------------------------------------------------------------
rem Ищем и выделяем строки с "0" (промежуточные итоги отчета Скеча)
args(0).Value = "$B$1"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args())
dim args1(17) as new com.sun.star.beans.PropertyValue
args1(0).Name = "SearchItem.StyleFamily"
args1(0).Value = 2
args1(1).Name = "SearchItem.CellType"
args1(1).Value = 0
args1(2).Name = "SearchItem.RowDirection"
args1(2).Value = true
args1(3).Name = "SearchItem.AllTables"
args1(3).Value = false
args1(4).Name = "SearchItem.Backward"
args1(4).Value = false
args1(5).Name = "SearchItem.Pattern"
args1(5).Value = false
args1(6).Name = "SearchItem.Content"
args1(6).Value = false
args1(7).Name = "SearchItem.AsianOptions"
args1(7).Value = false
args1(8).Name = "SearchItem.AlgorithmType"
args1(8).Value = 0
args1(9).Name = "SearchItem.SearchFlags"
args1(9).Value = 65552
args1(10).Name = "SearchItem.SearchString"
args1(10).Value = "-"
args1(11).Name = "SearchItem.ReplaceString"
args1(11).Value = ""
args1(12).Name = "SearchItem.Locale"
args1(12).Value = 255
args1(13).Name = "SearchItem.ChangedChars"
args1(13).Value = 2
args1(14).Name = "SearchItem.DeletedChars"
args1(14).Value = 2
args1(15).Name = "SearchItem.InsertedChars"
args1(15).Value = 2
args1(16).Name = "SearchItem.TransliterateFlags"
args1(16).Value = 1280
args1(17).Name = "SearchItem.Command"
args1(17).Value = 1
dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args1())
rem ----------------------------------------------------------------------
rem Удаляем найденные и выделенные строчки (те где в колонке Laer стоит "0", итоги отчета скеча)
dispatcher.executeDispatch(document, ".uno:DeleteRows", "", 0, Array())
rem ----------------------------------------------------------------------
rem --Замена точек на запятые в цифирях и формат десятичных знаков после запятой
args1(9).Value = 1054720
args1(10).Value = "."
args1(11).Value = ","
args1(17).Value = 3
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "NumberFormatValue"
rem --Меняем как и было выше - нудно, по столбику, если кому нужно чего пропустить-добавить-поменять, ремим, добавляем...
args(0).Name = "ToPoint"
args(0).Value = "$C$1"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args())
dispatcher.executeDispatch(document, ".uno:SelectColumn", "",5, Array())
dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args1())
rem два десятичных знака
args2(0).Value = 4
dispatcher.executeDispatch(document, ".uno:NumberFormatValue", "", 0, args2())
args(0).Value = "$D$1"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args())
dispatcher.executeDispatch(document, ".uno:SelectColumn", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args1())
rem два десятичных знака
dispatcher.executeDispatch(document, ".uno:NumberFormatValue", "", 0, args2())
args(0).Value = "$E$1"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args())
dispatcher.executeDispatch(document, ".uno:SelectColumn", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args1())
rem два десятичных знака
dispatcher.executeDispatch(document, ".uno:NumberFormatValue", "", 0, args2())
args(0).Value = "$F$1"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args())
dispatcher.executeDispatch(document, ".uno:SelectColumn", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args1())
rem три десятичных знака (колонка объема)
args2(0).Value = 114
dispatcher.executeDispatch(document, ".uno:NumberFormatValue", "", 0, args2())
args(0).Value = "$G$1"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args())
dispatcher.executeDispatch(document, ".uno:SelectColumn", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args1())
rem два десятичных знака
args2(0).Value = 4
dispatcher.executeDispatch(document, ".uno:NumberFormatValue", "", 0, args2())
args(0).Value = "$H$1"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args())
dispatcher.executeDispatch(document, ".uno:SelectColumn", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args1())
rem два десятичных знака
dispatcher.executeDispatch(document, ".uno:NumberFormatValue", "", 0, args2())
args(0).Value = "$I$1"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args())
dispatcher.executeDispatch(document, ".uno:SelectColumn", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args1())
rem два десятичных знака
dispatcher.executeDispatch(document, ".uno:NumberFormatValue", "", 0, args2())
args(0).Value = "$J$1"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args())
dispatcher.executeDispatch(document, ".uno:SelectColumn", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args1())
rem два десятичных знака
dispatcher.executeDispatch(document, ".uno:NumberFormatValue", "", 0, args2())
rem ----------------------------------------------------------------------
rem Пишем заголовки
args(0).Value = "$A$1"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args())
args1(10).Value = "LAYER"
args1(11).Value = "Слой"
dispatcher.executeDispatch(document, ".uno:SelectRow", "",5, Array())
dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args1())
args1(10).Value = "DEFINITION NAME"
args1(11).Value = "Материал"
dispatcher.executeDispatch(document, ".uno:SelectRow", "",5, Array())
dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args1())
args1(10).Value = "C"
args1(11).Value = "Сумма (руб)"
dispatcher.executeDispatch(document, ".uno:SelectRow", "",5, Array())
dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args1())
args1(10).Value = "K"
args1(11).Value = "Кол (шт)"
dispatcher.executeDispatch(document, ".uno:SelectRow", "",5, Array())
dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args1())
args1(10).Value = "L"
args1(11).Value = "Длина (м)"
dispatcher.executeDispatch(document, ".uno:SelectRow", "",5, Array())
dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args1())
args1(10).Value = "M"
args1(11).Value = "Масса (кг)"
dispatcher.executeDispatch(document, ".uno:SelectRow", "",5, Array())
dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args1())
args1(10).Value = "S"
args1(11).Value = "Площадь (м2)"
dispatcher.executeDispatch(document, ".uno:SelectRow", "",5, Array())
dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args1())
args1(10).Value = "V"
args1(11).Value = "Объем (м3)"
dispatcher.executeDispatch(document, ".uno:SelectRow", "",5, Array())
dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args1())
rem ----------------------------------------------------------------------
rem Готовим второй лист, там подобьем бабки по слоям (удобно собирать нагрузки).
rem Текущий лист, форматируем под смету (итоги по каждому материалу).
rem ----------------------------------------------------------------------
rem Выделяем все, копируем в буфер
dispatcher.executeDispatch(document, ".uno:SelectAll", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
rem ----------------------------------------------------------------------
rem Переименовываем текущий лист
dim args4(0) as new com.sun.star.beans.PropertyValue
args4(0).Name = "Name"
args4(0).Value = "Слои"
dispatcher.executeDispatch(document, ".uno:RenameTable", "", 0, args4())
rem ----------------------------------------------------------------------
rem Создаем новый лист (материалы)
dim args5(1) as new com.sun.star.beans.PropertyValue
args5(0).Name = "Name"
args5(0).Value = "Материалы"
args5(1).Name = "Index"
args5(1).Value = 1
dispatcher.executeDispatch(document, ".uno:Insert", "", 0, args5())
rem ----------------------------------------------------------------------
rem Вставляем копию первой таблицы
dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())
rem ----------------------------------------------------------------------
rem На листе Материалы удаляем колонку Слои
args(0).Value = "$A$1"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args())
dispatcher.executeDispatch(document, ".uno:DeleteColumns", "", 0, Array())
rem ----------------------------------------------------------------------
rem Сортируем лист Материалы по Материалам
dim args6(6) as new com.sun.star.beans.PropertyValue
args6(0).Name = "ByRows"
args6(0).Value = true
args6(1).Name = "HasHeader"
args6(1).Value = true
args6(2).Name = "CaseSensitive"
args6(2).Value = false
args6(3).Name = "IncludeAttribs"
args6(3).Value = true
args6(4).Name = "UserDefIndex"
args6(4).Value = 0
args6(5).Name = "Col1"
args6(5).Value = 1
args6(6).Name = "Ascending1"
args6(6).Value = true
dispatcher.executeDispatch(document, ".uno:DataSort", "", 0, args6())
rem ----------------------------------------------------------------------
rem Фиксируем строчки, стобцы
args(0).Value = "$B$2"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args())
dispatcher.executeDispatch(document, ".uno:FreezePanes", "", 0, Array())
rem ----------------------------------------------------------------------
rem Переходим в табличку Слои
dim args7(0) as new com.sun.star.beans.PropertyValue
args7(0).Name = "Nr"
args7(0).Value = 2
dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, args7())
rem ----------------------------------------------------------------------
rem Сортируем Слои по Слой/Материал
dim args8(8) as new com.sun.star.beans.PropertyValue
args8(0).Name = "ByRows"
args8(0).Value = true
args8(1).Name = "HasHeader"
args8(1).Value = true
args8(2).Name = "CaseSensitive"
args8(2).Value = false
args8(3).Name = "IncludeAttribs"
args8(3).Value = true
args8(4).Name = "UserDefIndex"
args8(4).Value = 0
args8(5).Name = "Col1"
args8(5).Value = 1
args8(6).Name = "Ascending1"
args8(6).Value = true
args8(7).Name = "Col2"
args8(7).Value = 2
args8(8).Name = "Ascending2"
args8(8).Value = true
dispatcher.executeDispatch(document, ".uno:DataSort", "", 0, args8())
rem ----------------------------------------------------------------------
rem Фиксируем строчки, стобцы
args(0).Value = "$C$2"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args())
dispatcher.executeDispatch(document, ".uno:FreezePanes", "", 0, Array())
rem ----------------------------------------------------------------------
rem Промежуточные итоги по слоям
rem Создаем колонки, по которым идет суммирование
dim STCol(5) as new com.sun.star.sheet.SubTotalColumn
STCol(0).Column = 2
STCol(0).Function = com.sun.star.sheet.GeneralFunction.SUM
STCol(1).Column = 3
STCol(1).Function = com.sun.star.sheet.GeneralFunction.SUM
STCol(2).Column = 4
STCol(2).Function = com.sun.star.sheet.GeneralFunction.SUM
STCol(3).Column = 5
STCol(3).Function = com.sun.star.sheet.GeneralFunction.SUM
STCol(4).Column = 6
STCol(4).Function = com.sun.star.sheet.GeneralFunction.SUM
STCol(5).Column = 7
STCol(5).Function = com.sun.star.sheet.GeneralFunction.SUM
rem Формируем интервал для слоев (тупо, по колонкам, с запасом)
STRange=thiscomponent.sheets.getByName("Слои").getCellRangeByName("A:M")
rem создаем объект промежуточных итогов, по сформированному интервалу
STDes = STRange.createSubTotalDescriptor(true)
rem добавляем колонки в промеж. итоги
STDes.addNew(STCol(), 0)
STDes.addNew(STCol(), 1)
rem Вычисляем промежуточные итоги
STRange.applySubTotals(STDes, true)
rem Повторяем тоже самое для Материалов
rem Формируем интервал
STCol(5).Column = 1
STCol(5).Function = com.sun.star.sheet.GeneralFunction.SUM
STRange=thiscomponent.sheets.getByName("Материалы").getCellRangeByName("A:M")
rem создаем объект промежуточных итогов, по сформированному интервалу
STDes = STRange.createSubTotalDescriptor(true)
rem добавляем колонки в промеж. итоги
STDes.addNew(STCol(), 0)
rem Вычисляем промежуточные итоги
STRange.applySubTotals(STDes, true)
End Sub