Python & ActiveX/COM Autocad

Автор Тема: Python & ActiveX/COM Autocad  (Прочитано 38146 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн DMuzer

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #225 : 14-01-2020, 17:13:47 »
Код - Python [Выбрать]
  1.         ent, p = doc.Utility.GetEntity()
  2.         print(ent, p)
  3.         pl = polyline(ent.Coordinates, doc)
  4.         npoint = pl.get_nearest_point(point2d(p, doc))
  5.         nline = pl.get_nearest_line(point2d(p, doc))
  6.         print(pl, npoint)
  7.        
  8.         ts = re.search(r"dn\d+", ent.Layer).group(0).upper()
  9.        
  10.         a1, b1, c1 = nline[0].nparams
  11.        
  12.         if (a1 != 0) != (b1 != 0) :        
  13.             pts = [npoint[0], npoint[1],0, npoint[0]-1000, npoint[1]-200, 0,]
  14.         else :
  15.              pts = [npoint[0], npoint[1],0, npoint[0]+200, npoint[1]-200, 0,]
  16.        
  17.         ml = doc.ModelSpace.AddMLeader(vtr(pts), 0)
  18.        
  19.        
  20.         ml[0].Layer = '_fsa-anno-notes'
  21.         ml[0].TextBackgroundFill=True
  22.         ml[0].TextJustify = 9
  23.         ml[0].TextString = ts
  24.         ml[0].ArrowHeadType = 19
  25.         ml[0].Update()
  26.  
  27.  
  28.  

Оффлайн DMuzer

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #226 : 14-01-2020, 17:21:56 »
Пара пояснений к коду:
Выноска - чтобы автоматически проставить диаметры на трубы, которые отрисованы полилиниями на разных слоях.
polyline и point2d - мои классы, для реализации выч. геометрии.

Онлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 10618
  • Карма: 1347
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #227 : 14-01-2020, 17:52:10 »
Ответ здесь: https://adn-cis.org/forum/index.php?topic=2709.0
Нужно использовать метод SetDoglegDirection
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DMuzer

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #228 : 14-01-2020, 18:08:31 »
Заработало с DogLegDirection, Спасибо!

Оффлайн DMuzer

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #229 : 22-01-2020, 13:32:00 »
Добрый день!
Подскажите, какими функциями надо воспользоваться, чтобы сделать копию существующего блока в чертеже? Именно определения  блока, а не блока в чертеже.
Попробовал несколько вариантов не получается. Например я пробовал так:

Код - Python [Выбрать]
  1. ent = doc.Utility.GetEntity()[0]
  2. lst = [doc.Blocks(ent.Name)]
  3. lst = VARIANT(VT_DISPATCH|VT_ARRAY, lst)
  4. res = doc.CopyObjects(lst)
  5.  

Пробовал добавлять и ModelSpace и Document в качестве нового собственника, пока не получилось...

Онлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 10618
  • Карма: 1347
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #230 : 22-01-2020, 13:34:59 »
Пробовал добавлять и ModelSpace и Document в качестве нового собственника, пока не получилось...
Попробуй в качестве нового собственника doc.Blocks
Впрочем подозреваю, что так не сработает. Нужно сначала создать блок с новым именем ( doc.Blocks.Add (...) ) и потом в него при помощи CopyObjects скопировать все объекты первого блока (т.е. новым собственником будет новый блок).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DMuzer

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #231 : 22-01-2020, 14:37:11 »
Видимо так и придется. Как думаете, если мне нужно скопировать определение блока в другой чертеж, тоже не получится? У меня получалось скопировать вхождение блока из одного чертежа в другой, и соответственно определение тоже копировалось, на крайний случай пойдет, но все таки на мой взгляд грубовато чтобы скопировать определение блока.

Онлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 10618
  • Карма: 1347
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #232 : 22-01-2020, 14:39:41 »
Как думаете, если мне нужно скопировать определение блока в другой чертеж, тоже не получится?
Попробуй. В пределах одного чертежа скорее всего не получится из-за совпадения имён блоков. В другом чертеже если одноимённого блока нет, то возможно скопируется. 
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DMuzer

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #233 : 22-01-2020, 14:41:54 »
Вот так у меня получилось сделать копию блока:

Код - JSON [Выбрать]
  1. ent = doc.Utility.GetEntity()[0]
  2. o_blk = doc.Blocks(ent.Name)
  3.  
  4. i = 0
  5. while True :
  6.     try :
  7.         b_name = f"{o_blk.Name}_{i:02d}"
  8.         n_blk = doc.Blocks.Add(vtr([0,0,0]),b_name)
  9.         break
  10.     except :
  11.         i += 1
  12.         raise
  13.        
  14. lst = [e for e in o_blk]
  15. v_lst = VARIANT(VT_DISPATCH|VT_ARRAY, lst)
  16.  
  17. res = doc.CopyObjects(v_lst, n_blk)
  18. print(n_blk)
  19.  
  20. res
  21.  

Эта функция возвращает кортеж из двух массивов, в котором возвращаются скопированные объекты. Я правильно понимаю, что это возвращаются и исходные объекты и новые? То есть в этом случае их как то можно связать, или после копирования передать какие то данные?

Онлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 10618
  • Карма: 1347
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #234 : 22-01-2020, 14:57:55 »
Я правильно понимаю, что это возвращаются и исходные объекты и новые?
Нет. Эта функция возвращает:
Цитировать
RetVal = object.CopyObjects(Objects [, Owner] [, IDPairs])
RetVal - Variant (array of objects)
An array of newly created duplicate objects. Only primary objects are returned in this array.

Т.е. только новые, да и то не все, а только главные.
А вот в IDPairs:
Цитировать
IDPairs - Variant (array of IDPair objects); input-output; optional
Information on what happened during the copy and translation process.
Input: an empty variant.
Output: an array of IDPair objects.
Т.е. здесь пара: старый-новый объекты.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DMuzer

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #235 : 23-01-2020, 01:17:23 »
Ну собственно справку я видел, как раз и вопрос возник, что не совсем понятно, что возвращает функция. Например, скопировала 3 объекта, а возвращает два массива по 3 объекта.
Что касается основных объектов - то я думаю имеется ввиду что если копируется блок, то будет возвращена ссылка именно на блок, а его составляющие возвращены не будут.
Надо будет поэксперементировать, понять, что же все таки она возвращает.

Оффлайн DMuzer

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #236 : 23-01-2020, 01:20:08 »
 Еще вопрос, у меня есть динамический блок, функция GetBoundingBox возвращает границы объекта включая все невидимые примитивы этого блока, включая и те, которые входят в другие варианты отображения блока.
Существует ли способ определить именно видимые границы блока? то есть только для активной видимости динамического блока?

Онлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 10618
  • Карма: 1347
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #237 : 23-01-2020, 01:41:48 »
Все примитивы, невидимые в текущей видимости вставки блока в составе своего анонимного блока имеют признак Visible установленную в False. Это наводка для получения правильного GetBoundingBox - такие примитивы следует пропустить. Т.е. необходимо вычислить GetBoundingBox для всех видимых примитивов в блоке, а затем этот "ящик" преобразовать по матрице преобразования блока (которую нужно вычислить и готового алгоритма для COM/ActiveX я не нашел). Альтернативный вариант - вызов метода Explode с вычислением GetBoundingBox и последующим удалением полученных примитивов.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DMuzer

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 2
Re: Python & ActiveX/COM Autocad
« Ответ #238 : 23-01-2020, 10:44:58 »
То есть получается, что без костылей никак?
Скажите а в .net такие функции присутствуют?

Онлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 10618
  • Карма: 1347
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Python & ActiveX/COM Autocad
« Ответ #239 : 23-01-2020, 11:05:19 »
Скажите а в .net такие функции присутствуют?
В .NET у BlockReference есть свойство BlockTransform, которое возвращает матрицу преобразования из координат блока в координаты МСК (WCS).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение