| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Создание штриховки посредством метода COM-интерфейса

Создание штриховки посредством метода COM-интерфейса

Ответ
Поиск в этой теме
Непрочитано 08.07.2015, 12:27 #1
Создание штриховки посредством метода COM-интерфейса
SirJorah
 
Регистрация: 08.07.2015
Сообщений: 5

Уважаемые коллеги! В наличии следующий код на Python:
Код:
[Выделить все]
 from comtypes.client import *
    from comtypes.automation import *
    def connect_acad(self):
        errcode = 0
        try:
            self.acad = GetActiveObject("AutoCAD.Application")
        except:
            errcode = 1
        if errcode == 0:
            try:
                self.dwg = self.acad.ActiveDocument
            except:
                errcode = 2
        if errcode == 0:
            self.mspace = self.dwg.ModelSpace
        return errcode
    def mark_point(self, xy, num, lay):
        
        def point(*args):
            lst = [0.]*3
            if len(args) < 3:
                lst[0:2] = [float(x) for x in args[0:2]]
            else:
                lst = [float(x) for x in args[0:3]]
            return VARIANT(array("d",lst))
        
        txthght = 1.0
        txtshft = 0.3
        crclrd = 0.3
        p1 = point(xy[0], xy[1])
        ent = self.mspace.AddCircle(p1, crclrd)
        ent.Layer = lay
        #htch = self.mspace.AddHatch(0, 'SOLID', False)
        #htch.AppendOuterLoop(array("i", [ent,]))
        #htch.Evaluate()
        #htch.Layer = lay
        p1 = point(xy[0]+txtshft, xy[1]+txtshft)
        sh = len(num)
        if (len(self.nprefix) > 0) and (len(num.replace(self.nprefix, '')) > 3):
            sh = sh // 2
        th = string.Template('\H'+str(txthght)+';$n')
        ent = self.mspace.AddMText(p1, sh, th.substitute(n=num))
        ent.LineSpacingFactor = 0.7
        ent.Layer = lay
(Привожу сильно в сокращении - только то, что касается вопроса. Если вдруг кому интересно - полный код здесь: https://github.com/nsedenkov/py_acad...r/acadcoord.py) Вопрос в следующем: закоментаренные строки в функции mark_point - это попытка заштриховать окружность, создаваемую выше методом AddCircle. Сам объект “штриховка” (Hatch) создается, однако чтобы его отобразить, нужно задать внешнюю границу методом AppendOuterLoop, аргументом которого должен быть массив графических примитивов AutoCAD в обертке VARIANT (подобно тому, который возвращает функция point - с той лишь разницей, что point возвращает массив из 2 или 3 чисел float). Вот собственно и вопрос: может кто знает, как передать в метод com-интерфейса массив графических примитивов (собственно, примитив будет один - та самая окружность, которая на данном этапе висит в переменной ent)? Заранее признателен за любой совет.
Просмотров: 3557
 
Непрочитано 08.07.2015, 12:35
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 38,696


Посмотри в справке по VBA как создается штриховка: там помимо добавления наружных контуров, насколько я помню, надо еще и Evaluate выполнять.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 08.07.2015, 12:44
#3
trir


 
Регистрация: 18.12.2010
Сообщений: 4,758


как говорится - пользуйтесь поиском
http://forum.dwg.ru/showthread.php?t=115170

Код:
[Выделить все]
VARIANT(array("i", [ent,]))
trir вне форума  
 
Автор темы   Непрочитано 08.07.2015, 13:26
#4
SirJorah


 
Регистрация: 08.07.2015
Сообщений: 5


Спасибо, коллеги. Все это уже испытано - и evaluate, и обертка в variant. Итог один: "Type error: an integer is required". Все потому, что в Python массивы вообще имеют ограниченное применение и тип их может быть либо integer, либо float. Более широко применяются списки, кортежи и словари, но данные виды последовательностей не устраивают Автокад. Я задал вопрос в надежде, что кто-нибудь знает некий обходной маневр, позволяющий таки подсунуть Автокаду то, что он ожидает.
PS Сама штриховка благополучно создается - моя софтина показывает список примитивов в каждом слое и при повторном запуске после ошибки "Type error: an integer is required" я вижу, что объект "штриховка" в слое 0 появляется. Только он невидим, поскольку не удается задать внешнюю границу.
SirJorah вне форума  
 
Непрочитано 08.07.2015, 13:31
#5
trir


 
Регистрация: 18.12.2010
Сообщений: 4,758


Используй NET API

P.S. Это всё делается в Civil'е

Последний раз редактировалось trir, 08.07.2015 в 13:37.
trir вне форума  
 
Автор темы   Непрочитано 08.07.2015, 13:52
#6
SirJorah


 
Регистрация: 08.07.2015
Сообщений: 5


Еще раз благодарю за советы. Наш отдел работает в "голом" Автокаде, так что Civil к сожалению не вариант. Должно быть так, чтобы коллеги оставались в привычном рабочем окружении - просто маленькая доп.софтина, которая делает свое дело и убирается с глаз долой. А вот NET API надо копнуть, спасибо.
SirJorah вне форума  
 
Непрочитано 08.07.2015, 13:59
#7
trir


 
Регистрация: 18.12.2010
Сообщений: 4,758


Почему Python???
trir вне форума  
 
Автор темы   Непрочитано 08.07.2015, 14:08
#8
SirJorah


 
Регистрация: 08.07.2015
Сообщений: 5


Философский вопрос. Когда сроки горят и надо чтобы максимум завтра все работало, хватаешь то, что окажется под рукой. Под руку попал Python. Кодить на нем в большинстве случаев комфортно, легко и быстро удается допиливать сообразно ситуации (то есть если попросят сделать не так, а слегка вот эдак). Видимо поэтому.
SirJorah вне форума  
 
Непрочитано 08.07.2015, 14:15
#9
trir


 
Регистрация: 18.12.2010
Сообщений: 4,758


Ну ведь lisp/VBA тоже всегда под рукой
trir вне форума  
 
Автор темы   Непрочитано 08.07.2015, 14:36
#10
SirJorah


 
Регистрация: 08.07.2015
Сообщений: 5


Ваша правда, уважаемый друг. Возможно, выбор средства был не вполне удачен. Ну да ладно, остальное-то все работает, загвоздка только со штриховкой. На рабочий процесс это не влияет. Даже если из python отобразить штриховку так и не удастся - все равно данный скрипт экономит много часов рабочего времени при координировании и нумерации точек земельных участков, выделяемых под строительство многокилометровых трасс трубопроводов и кабельных линий.
SirJorah вне форума  
 
Непрочитано 08.07.2015, 21:39
#11
trir


 
Регистрация: 18.12.2010
Сообщений: 4,758


http://stackoverflow.com/questions/1...nsional-arrays
trir вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Создание штриховки посредством метода COM-интерфейса

Система Техэксперт дает уверенность в правильности и эффективности принимаемых инженерных решений!
Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
SCAD Office 21.1. Обсуждение. Клименко Ярослав SCAD 633 03.10.2015 14:10
создание образцов штриховки по госту(расширение рат) Aleksshustr AutoCAD 6 16.10.2010 20:25
Создание штриховки, как инструмента вычисления площади ikoltsov AutoCAD 1 15.04.2009 19:02
Сканирование и создание штриховки Avant AutoCAD 4 15.06.2007 14:44