# coding: windows-1251 # Импорт модуля подгрузки библиотек .Net import clr import dlr # Добавление ссылок на библиотеки .Net clr.AddReference("System.Windows.Forms") clr.AddReference("Topomatic.Cad.Foundation") clr.AddReference("Topomatic.Cad.View") clr.AddReference("Topomatic.Dwg") # В качестве примера взаимодействия с системный библиотеками Windows # добавим библиотеку Windows Forms и для удобства назначим ей псевдоним import System.Windows.Forms as win_forms # Импорт пространств имён начинающихся с Topomatic import Topomatic # Импорт перечисления Topomatic.Cad.Foundation.CadColor # с указанным псевдонимом для удобного доступа в цветовой палитре import Topomatic.Cad.Foundation.CadColor as cad_colors # Инициализация переменных custom_text_style_name = "Custom Text Style" custom_text_style_font_name = "Arial.ttf" custom_layer_name = "Custom Layer" # Определение метода для упрощения процесса отладки @dlr.params(str) def report(msg): """ Отправка сообщения в окно командной строки. Аргументы: msg - строка (str) """ Topomatic.Cad.View.ConsoleListner.Current.WriteLine(msg) # Определение основного метода правила оформления @dlr.params(Topomatic.Dwg.DwgBlock, str, float) def execute(model, path, scale): """ Основной метод правила. Аргументы: model -- Основной блок чертежа (Topomatic.Dwg.DwgBlock), path -- Путь к файлу исполняемого в текущий момент правила оформления плана (str), scale -- Масштаб листа (float) """ # Отправляем в командную строку сообщение о начале выполнения правила report("Начало выполнения правила") # Получаем чертёж необходимые коллекции его элементов drawing = model.Drawing entities = model.Entities # Примитивы layers = drawing.Layers # Слои text_styles = drawing.Styles # Текстовые стили # Получаем пользовательский текстовый стиль text_style = get_or_create_custom_text_style(text_styles) # Меняем текстовый стиль текстовых примитивов на пользовательский if text_style is not None: change_entity_text_style(entities, text_style) # Получаем пользовательский слой layer = get_or_create_custom_layer(layers) # Меняем слой у всех примитивов красного цвета на пользовательский # и устанавливаем им цвет "По слою" if layer is not None: change_entity_layer(entities, layer) # Сообщаем о завершении работы правила с помощью # диалогового окна системной библиотеки Windows Forms win_forms.MessageBox.Show("Правило успешно применено", "Правило оформления чертежа плана", win_forms.MessageBoxButtons.OK, win_forms.MessageBoxIcon.Information) # Определение метода для получения пользовательского текстового стиля @dlr.params(Topomatic.Dwg.DwgStyles) def get_or_create_custom_text_style(text_styles): """ Получение пользовательского текстового стиля. Аргументы: text_styles - Коллекция текстовых стилей (Topomatic.Dwg.DwgStyles) """ # Отправляем в командную строку сообщение о начале получения текстового стиля report("Получение пользовательского текстового стиля") # Получение текстового стиля по имени из коллекции # Если стиль не обнаружен, то добавляем его и устанавливаем # значения необходимых параметров style = text_styles[custom_text_style_name] if style == None: style = text_styles.Add(custom_text_style_name, custom_text_style_font_name) style.Height = 3 style.Ratio = 0.8 # Возвращаем пользовательский текстовый стиль return style # Определение метода для изменения текстового стиля текстовых примитивов @dlr.params(Topomatic.Dwg.DwgEntities, Topomatic.Dwg.DwgStyle) def change_entity_text_style(entities, text_style): """ Изменение текстового стиля текстовых примитивов. Аргументы: entities - Коллекция примитивов (Topomatic.Dwg.DwgEntities) text_style - Текстовый стиль (Topomatic.Dwg.DwgStyle) """ # Отправляем в командную строку сообщение о начале получения текстового стиля report("Изменение текстового стиля текстовых примитивов") # Проходим по коллекции примитивов и если примитив это # Текст (DwgText) или Мультитекст (DwgMText), # то меняем его текстовый стиль на пользовательский for i in xrange(0, entities.Count - 1): entity = entities[i] if (isinstance(entity, Topomatic.Dwg.Entities.DwgText)) or (isinstance(entity, Topomatic.Dwg.Entities.DwgMText)): entity.Style = text_style # Определение метода для получения пользовательского слоя @dlr.params(Topomatic.Dwg.DwgLayers) def get_or_create_custom_layer(layers): """ Получение пользовательского слоя. Аргументы: layers - Коллекция слоёв (Topomatic.Dwg.DwgLayers) """ # Отправляем в командную строку сообщение о начале получения слоя report("Получение пользовательского слоя") # Получение слоя по имени из коллекции # Если слой не обнаружен, то добавляем его и устанавливаем # значения красный цвета слоя используя псевдоним cad_colors layer = layers[custom_layer_name] if layer == None: layer = layers.Add(custom_layer_name) layer.Color = cad_colors.Red # Возвращаем пользовательский слой return layer # Определение метода для изменения слоя у примитивов красного цвета @dlr.params(Topomatic.Dwg.DwgEntities, Topomatic.Dwg.DwgLayer) def change_entity_layer(entities, layer): """ Изменение слоя примитивов красного цвета на пользовательский и назначение им цвета "По слою". Аргументы: entities - Коллекция примитивов (Topomatic.Dwg.DwgEntities) layer - Слой (Topomatic.Dwg.DwgLayer) """ # Отправляем в командную строку сообщение о начале изменения слоя примитивов красного цвета report("Изменение слоя примитивов красного цвета и назначение им цвета \"По слою\"") # Проходим по коллекции примитивов и если примитив это # Текст (DwgText) или Мультитекст (DwgMText), то меняем его текстовый стиль for i in xrange(0, entities.Count - 1): entity = entities[i] if (entity.Color == cad_colors.Red): entity.Layer = layer entity.Color = cad_colors.ByLayer # Точка входа. # Если переменная '__model' проинициализирована, # то изменяем чертёж if (__model != None): execute(__model, __path, __scale) else: raise AssertionError("\"__model\" variable is not defined")