Форум НПФ  

Вернуться   Форум НПФ "ТОПОМАТИК" > Программные продукты "Топоматик Robur" на платформе "Robur AP3" > Средства разработки Топоматик Robur > Вопросы и ответы
Ник
Пароль
Регистрация FAQ Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05-10-2017, 13:16
Vladimir_Sergeevich Vladimir_Sergeevich вне форума
Пользователь
 
Регистрация: Feb 2014
Адрес: Пермь
Сообщения: 67
По умолчанию Структура проекта

Уважаемые разработчики прошу помочь разобраться со структурой робура.
Есть опыт программирования под AutoCAD через COM модель и там достаточно простая картинка: есть объект IAcadApplication у которого в свойствах есть коллекция документов IAcadDocument которые есть открытые dwg и у него в свою очередь можно уже запрашивать коллекции слоев/блоков/стилей и пр...
При этом через IAcadApplication можно достучаться и до файлов адаптации и до глобальных настроек системы.
А через IAcadDocument до всего что касается текущего чертежа.

В робуре структура несколько запутанней.
Первая попытка достучаться до коллекции блоков подобъекта потерпела крах "TypeError: DwgBlocks is not callable ". В итоге разобрался, но...
Сейчас в мечтах достучаться сразу до настроек проектной поверхности и таблицы слоев, но пока приходится руками (надо привести в порядок несколько десятков съездов созданных ранее).

Вероятно не ошибусь, предположив, что .net весьма отличается от обертки COM и, что модули на pyton - тот же .net
И хотя, с точки зрения юзера, модель весьма схожа, с точки зрения разработчика все по другому...

з.ы. в примерах есть такой код
Код:
@action('print', alias='test') def act_test(self, sender, e): cadview = self.CadView
Поясните пожалуйста, кого получает метод act_test в качестве параметра self (объект какого класса и в какой сборке искать инфу?)?

Последний раз редактировалось Vladimir_Sergeevich, 05-10-2017 в 14:21.
Ответить с цитированием
  #2  
Старый 05-11-2017, 16:41
Зайцев Максим Зайцев Максим вне форума
Разработчик Robur
 
Регистрация: Sep 2016
Сообщения: 9
По умолчанию

self - объект типа Topomatic.ApplicationPlatform.Module
Аналог IAcadDocument можно получить так:
drawing = DrawingLayer.GetDrawingLayer(cadview).Drawing
А дальше:
Слои - drawing.Layers
Блоки - drawing.Blocks
Текстовые стили drawing.Styles

Поверхность
surface = SurfaceLayer.GetSurfaceLayer(cadview).Surface
Стили поверхности
Точки surface.Style.PointsStyle
Горизонтали surface.Style.HorizontalsStyle
Треугольники surface.Style.TrianglesStyle
Структурные линии surface.Style.StructureLinesStyle
Общие настройки surface.Style.CommonStyle
Ответить с цитированием
  #3  
Старый 05-12-2017, 8:21
Vladimir_Sergeevich Vladimir_Sergeevich вне форума
Пользователь
 
Регистрация: Feb 2014
Адрес: Пермь
Сообщения: 67
По умолчанию

Очень не хватает описания библиотеки Topomatic.ApplicationPlatform для понимания ситуации. Полагаю, большинство вопросов само бы отпало.

Что касается self.ActiveDrawingLayer.Drawing - здесь все достаточно понятно и логично.

С проектной поверхностью ничего не понятно.
В примерах есть код для работы с черной землей
Код:
surface = self.ActiveSurface if (surface == None): #Активная ЦММ не найдена print 'Активная ЦММ не найдена' return
Для проектной поверхности он не применим

surface = SurfaceLayer.GetSurfaceLayer(cadview).Surface
#global name 'SurfaceLayer' is not defined
В документации поиск на запросы "SurfaceLayer" и "GetSurfaceLayer" ничего не выдает.
В порядке эксперимента пробовал подставлять self.SurfaceLayer... model.SurfaceLayer... alignment.SurfaceLayer... никто из перечисленных такого атрибута не имеет.
В какой то момент догадался добавить
from Topomatic.Sfc.Layer import SurfaceLayer
Теперь, похоже, SurfaceLayer.GetSurfaceLayer(cadview). возвращает "null"
#'NoneType' object has no attribute 'Surface'
И таки да, описания Topomatic.Sfc.Layer также нет нигде
Ответить с цитированием
  #4  
Старый 05-12-2017, 11:26
Василий Гончаров Василий Гончаров вне форума
Разработчик Robur
 
Регистрация: Oct 2016
Сообщения: 27
По умолчанию

Попробуйте использовать surface = SurfaceLayer.GetSurfaceLayer(cadview, true).Surface. Флаг true означает что вы получаете слой в режиме readOnly и не собираетесь менять данные, только читать. Дело в том что проектная поверхность в Robur пока перестраивается динамически, возможность ручного редактирования будет реализована позже. Все изменения которые Вы внесёте в проектную поверхность будут стерты при следующем перестроении.

К сожалению часть документации, в том числе по Sfc.Layer пока еще не доступна в текущем варианте, в качестве временного решения могу предложить Вам исследовать интересующие Вас сборки, в частности Topomatic.Sfc.Layer.dll и просмотреть методы, которые там находятся (например используя бесплатную утилиту dotPeek http://www.jetbrains.com/decompiler/). По названию большинства из них можно определить для чего они предназначены.
Ответить с цитированием
  #5  
Старый 05-12-2017, 12:30
Vladimir_Sergeevich Vladimir_Sergeevich вне форума
Пользователь
 
Регистрация: Feb 2014
Адрес: Пермь
Сообщения: 67
По умолчанию

Цитата:
Сообщение от Василий Гончаров
Дело в том что проектная поверхность в Robur пока перестраивается динамически, возможность ручного редактирования будет реализована позже. Все изменения которые Вы внесёте в проектную поверхность будут стерты при следующем перестроении.

Мне не нужно руками трогать саму поверхность, я хочу программно настроить стиль отображения.

Резюмируя:
Добавляем в шапку from Topomatic.Sfc.Layer import SurfaceLayer
И доступ через SurfaceLayer.GetSurfaceLayer(cadview, True).Surface.Style.HorizontalsStyle вполне корректно осуществляется.

В развитие темы.
В примерах есть получение указателя на активный подобъект. ModelWatcher.Current.ActiveModel
Есть желание получить коллекцию всех подобъектов проекта, поочередно их сделать активными и прогнать в каждом алгоритм настройки который уже есть...
Скорее всего, на текущем проекте это уже не пригодится, но в будущем будет полезно.
Ответить с цитированием
  #6  
Старый 05-12-2017, 12:57
Василий Гончаров Василий Гончаров вне форума
Разработчик Robur
 
Регистрация: Oct 2016
Сообщения: 27
По умолчанию

Тут можно воспользоваться следующей конструкцией:

в шапке добавить from Topomatic.Alg.Runtime.ServiceClasses import AlignmentWatcher

в коде:

for item in AlignmentWatcher.GetCollection("34BEB340-9020-4375-AF31-F89CE48FA0FE").GetItems(None):
#так можно получить поверхность
surface = item.WrappedObject.Surface
#так можно получить подобъект
alignment = item.WrappedObject.Alignment
#так сделать активным
item.Active = True

Делать активными подобъекты без необходимости не рекомендуется, это может сказаться на быстродействии. Для Вашей задачи достаточно просто после изменения данных поставить флаг item.WrappedObject.Modified = True.

метод AlignmentWatcher.GetCollection("34BEB340-9020-4375-AF31-F89CE48FA0FE") позволяет получить все автомобильные дороги, а AlignmentWatcher.GetCollection("F6E6EB7B-2639-402d-8801-6BBB988F534C") все железные. Пока такой подход не очень удобен, поэтому в данный момент мы его перерабатываем, чтобы с ним было удобней работать.
Ответить с цитированием
  #7  
Старый 05-17-2017, 13:22
Vladimir_Sergeevich Vladimir_Sergeevich вне форума
Пользователь
 
Регистрация: Feb 2014
Адрес: Пермь
Сообщения: 67
По умолчанию

Цитата:
Сообщение от Василий Гончаров
метод AlignmentWatcher.GetCollection("34BEB340-9020-4375-AF31-F89CE48FA0FE") позволяет получить все автомобильные дороги, а AlignmentWatcher.GetCollection("F6E6EB7B-2639-402d-8801-6BBB988F534C") все железные. Пока такой подход не очень удобен, поэтому в данный момент мы его перерабатываем, чтобы с ним было удобней работать.

Я правильно понимаю, что большой шестнадцатеричный код коллекции соответствует
<Folder TypeId="34beb340-9020-4375-af31-f89ce48fa0fe" Name="Автомобильные дороги">
<Folder TypeId="2986169f-a8d6-40d9-9329-1975f215e5b8" Name="ЦММ">
из файла .rbproj
и соответственно по номеру 2986169f-a8d6-40d9-9329-1975f215e5b8 получаются черные поверхности?

Ну и соответственно делаю вывод, что допускается делать изменения в слоях не делая их активными (здесь под слоем понимается слои поверхностей/трасс)

Последний раз редактировалось Vladimir_Sergeevich, 05-17-2017 в 13:25.
Ответить с цитированием
  #8  
Старый 05-17-2017, 15:03
Василий Гончаров Василий Гончаров вне форума
Разработчик Robur
 
Регистрация: Oct 2016
Сообщения: 27
По умолчанию

В целом да. Изменения в модель можно вносить не делая её активной. Если Вы хотите корректно поддержать коллективную работу, то рекомендую сначала вызвать у элемента item функцию Lock, а по окончанию редактирования данных Unlock или поймать исключение что Lock выполнить невозможно. В режиме коллективной работы это скажет программе о том что вы забираете элемент на редактирование, а потом что редактирование закончено и надо сохранить элемент и сказать другим участникам что им необходимо этот элемент перезагрузить. Кроме того нужно принимать во внимание, что внутри item.WrappedObject - будут объекты разных типов, и у черных поверхностей свойства Alignment естественно нет.
Хочу заметить, что сейчас этот механизм находится в стадии переработки, и будет решен проще и удобней для разработчиков.
Ответить с цитированием
  #9  
Старый 06-15-2017, 10:08
Vladimir_Sergeevich Vladimir_Sergeevich вне форума
Пользователь
 
Регистрация: Feb 2014
Адрес: Пермь
Сообщения: 67
По умолчанию

Плавно перехожу на C# и есть новые вопросы:
Есть ли возможность докопаться до CUI программно. Идея в том, что бы, при инициализации библиотеки, проверялось наличие команд в меню и, при необходимости, их добавление. Ну и есть желание подредактировать контекстное меню существующее. При обновлении сборок эти настройки будут улетать и каждый раз делать заново - не есть интересно.
Ответить с цитированием
  #10  
Старый 06-15-2017, 12:09
Василий Гончаров Василий Гончаров вне форума
Разработчик Robur
 
Регистрация: Oct 2016
Сообщения: 27
По умолчанию

Добрый день. Вы не могли бы более подробно описать задачу. Дело в том что ближе к концу этого года готовится к выпуску версия с переработанным ядром, для улучшения быстродействия и подход к формированию меню будет отличатся от принятого в версии 8.0. Кроме того пользовательские настройки CUI должны сохраняться и меняться только при переходе через версию, т.е. от 8.0 к 8.1. А это не очень частая ситуация.
Ответить с цитированием
Ответ


Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 1:58.

Навигация по основному сайту
Главная Каталог продуктов и услуг Где купить Сопровождение
Вакансии О компании Обзоры Канал на YouTube

vBulletin v3.0.7 , Copyright ©2000-2018, Jelsoft Enterprises Ltd.
Copyright © 2003-2018, НПФ "ТОПОМАТИК".