Сообщество программистов Autodesk в СНГ

ADN Club => AutoLisp / VisualLISP и DCL => Тема начата: Кирилл Никифоров от 27-11-2018, 11:51:56

Название: Ограничения entmakex
Отправлено: Кирилл Никифоров от 27-11-2018, 11:51:56
Здравствуйте!

На днях столкнулся с неожиданным поведением функции entmakex.
Описание проблемы: В файле чертежа вставлена внешняя ссылка (подложка с планом) объемом около 160 Мб. Тяжело, но автокад дышит. Запускается лисп, который должен создать анонимный блок, а затем создать вставку этого блока в пространстве модели. В лиспе используется entmakex в обоих случаях.
Блок создается (имя приблизительно *U33333), но при вставке возвращается nil. Ладно, ну не смог... хотя непонятно почему. Но самое интересное - дальше. Если создать именованный блок, то при запуске возвращается имя примитива, но УДАЛЁННОЕ, и никакой вставки. Линии, полилинии создаются "на ура".
Без такой большой внешней ссылки, естественно, все работает, как ожидается.

Собственно вопрос: это нормально? ))) Ни про какие ограничения entmakex за много лет я сведений не нашел.
Название: Re: Ограничения entmakex
Отправлено: Александр Ривилис от 27-11-2018, 12:00:58
Я бы предположил, что это какой-то баг. Но его причину и есть ли возможность его обойти - не скажу.
Название: Re: Ограничения entmakex
Отправлено: Кирилл Никифоров от 27-11-2018, 12:39:23
Обойти может vla-InsertBlock, что собственно мы и сделали.
Но "нежданчик" насторожил.
Название: Re: Ограничения entmakex
Отправлено: Александр Ривилис от 27-11-2018, 13:01:37
Проверяли в нескольких версиях AutoCAD со всеми обновлениями?
Название: Re: Ограничения entmakex
Отправлено: Кирилл Никифоров от 27-11-2018, 13:23:35
2016-x64 и 2018-x64 дают одинаковый результат. И - да, со всеми апдейтами.
Подозреваю, что виновато имя блока большее, чем 32768.
Название: Re: Ограничения entmakex
Отправлено: Александр Ривилис от 27-11-2018, 13:32:13
Подозреваю, что виновато имя блока большее, чем 32768.
Не понял. Имеется в виду число в наименовании неименованного блока? Тогда причем здесь внешняя ссылка? Или в ней тоже огромное количество неименованных блоков?
Проверить несложно. Достаточно в цикле создать > 32K неименованных блоков.
Название: Re: Ограничения entmakex
Отправлено: Кирилл Никифоров от 27-11-2018, 14:15:34
Проверил. Работает значительно дальше. Предположение было ошибочным.
Название: Re: Ограничения entmakex
Отправлено: Кирилл Никифоров от 27-11-2018, 14:50:59
Блоков создает "без счета", я не дождался конца (больше 33000)
А вот инсерты может создать из блока с именем <= *U32767. *U32768 уже nil.
Предположение подтверждается.
Название: Re: Ограничения entmakex
Отправлено: Александр Ривилис от 27-11-2018, 14:54:04
Интересный факт. Нужно подумать как сделать тестовый файл и демонстрационную программку в несколько строк. Тогда можно будет отправить в ADN DevHelp.
Название: Re: Ограничения entmakex
Отправлено: Кирилл Никифоров от 27-11-2018, 14:58:28
OK
Сейчас попробую оформить.
Название: Re: Ограничения entmakex
Отправлено: Александр Ривилис от 27-11-2018, 15:00:55
OK
Сейчас попробую оформить.
Спасибо! Я заодно проверю в AutoCAD 2019 со всеми обновлениями. Если исправлено, то особого смысла отправлять нет - это значит, что этот баг уже отправляли и его исправили и к старым версиям (даже 2018) решили не возвращаться.
Название: Re: Ограничения entmakex
Отправлено: Алексей Кулик от 27-11-2018, 15:01:19
А почему не использовать конструкцию вида
Код - Auto/Visual Lisp [Выбрать]
  1. (setq def (vlax-vla-object->ename (vla-add (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
  2.                                            (vlax-3d-point '(0. 0. 0.))
  3.                                            "*U"
  4.                                            ) ;_ end of vla-add
  5.                                   ) ;_ end of vlax-vla-object->ename
  6.       ) ;_ end of setq
Если уж так нужен именно entmake? Имя будет гарантированно уникальное.
Хотя сам факт невозможности создания анонимного блока интересен.
Название: Re: Ограничения entmakex
Отправлено: Александр Ривилис от 27-11-2018, 15:06:04
Алексей Кулик,
Так вариант с vla-InsertBlock уже выше был предложен как workaround. Или ты о чем-то другом?
И вообще-то тут отловленный баг, который не мешало бы отправить.
Название: Re: Ограничения entmakex
Отправлено: Александр Ривилис от 27-11-2018, 15:07:51
Хотя сам факт невозможности создания анонимного блока интересен.
Блок создаётся, но не вставляется при помощи (entmake)
Название: Re: Ограничения entmakex
Отправлено: Алексей Кулик от 27-11-2018, 15:08:11
Я не про вставку, а про создание анонимного блока. Я так понял, что проблема именно в этом - невозможно создать анонимный блок, если число превышает 2^15-1
Название: Re: Ограничения entmakex
Отправлено: Александр Ривилис от 27-11-2018, 15:09:01
Я так понял, что проблема именно в этом - невозможно создать анонимный блок, если число превышает 2^15-1
Нет. Блок создаётся, но не вставляется.
Название: Re: Ограничения entmakex
Отправлено: Кирилл Никифоров от 27-11-2018, 15:16:01
Код - Auto/Visual Lisp [Выбрать]
  1. (defun testblock ()
  2.  (entmake (list
  3.               (cons 0 "BLOCK")
  4.               (cons 100 "AcDbEntity")
  5.               (cons 8 "0")
  6.               (cons 100 "AcDbBlockBegin")
  7.               (cons 2 "*Unnamed")
  8.               (cons 70 1)
  9.               (cons 10 (list 0.0 0.0 0.0))))
  10.   (entmakex (list (cons 0 "LWPOLYLINE")
  11.                   (cons 100 "AcDbEntity")
  12.                   (cons 100 "AcDbPolyline")
  13.                   (cons 90 3)
  14.                   (cons 8 "0")
  15.                   (cons 10 (quote (-150.0 0.0)))
  16.                   (cons 40 300.0)
  17.                   (cons 41 50.0)
  18.                   (cons 42 0.0)
  19.                   (cons 10 (quote (100.0 0.0)))
  20.                   (cons 40 300.0)
  21.                   (cons 41 300.0)
  22.                   (cons 42 0.0)
  23.                   (cons 10 (quote (150.0 0.0)))
  24.                   (cons 40 0.0)
  25.                   (cons 41 0.0)
  26.                   (cons 42 0.0)))
  27.   (entmake (list
  28.               (cons 0 "ENDBLK")
  29.               (cons 100 "AcDbEntity")
  30.               (cons 100 "AcDbBlockEnd")
  31.               (cons 8 "0"))))
  32.  
  33. (defun make-blocks ( / aName aNum)
  34.   (setq aName "0"
  35.         aNum 0)
  36.   (while (and aName (< aNum 33000))
  37.     (setq aName (testblock)
  38.           aNum (1+ aNum)))
  39.   (princ aName))
  40.  
  41. (defun test (aName)
  42.   ;; (setq aName "*U33000")        
  43.  (entmakex
  44.    (list
  45.      (cons 0 "INSERT")
  46.      (cons 100 "AcDbEntity")
  47.      (cons 100 "AcDbBlockReference")
  48.      (cons 2 aName)
  49.      (cons 10 (list 0.0 0.0 0.0))
  50.      (cons 50 0.0))))
  51.  
  52. ;;; (make-blocks)
  53. ;;; (test "*U32767")
  54. ;;; (test "*U32768") - nil
  55.  
Название: Re: Ограничения entmakex
Отправлено: Александр Ривилис от 27-11-2018, 15:27:20
Кирилл Никифоров,
В AutoCAD 2019.1.2 (т.е. в последней на данный момент версии) не работает. Так что отправляю в ADN DevHelp. Спасибо!
Название: Re: Ограничения entmakex
Отправлено: Кирилл Никифоров от 27-11-2018, 15:28:32
Вам спасибо, Александр, за содействие и сочувствие.  :)
Название: Re: Ограничения entmakex
Отправлено: Кирилл Никифоров от 27-11-2018, 15:42:04
А если после создания 33000 анонимных блоков попробовать создать именованный, то при попытке вставки возвращается УДАЛЕННОЕ <EntityName>.
Код для теста:

Код - Auto/Visual Lisp [Выбрать]
  1. (defun named-testblock ()
  2.  (entmake (list
  3.               (cons 0 "BLOCK")
  4.               (cons 100 "AcDbEntity")
  5.               (cons 8 "0")
  6.               (cons 100 "AcDbBlockBegin")
  7.               (cons 2 "TestBlock") ;_ BlockName
  8.               (cons 70 0)
  9.               (cons 10 (list 0.0 0.0 0.0))))
  10.   (entmakex (list (cons 0 "LWPOLYLINE")
  11.                   (cons 100 "AcDbEntity")
  12.                   (cons 100 "AcDbPolyline")
  13.                   (cons 90 3)
  14.                   (cons 8 "0")
  15.                   (cons 10 (quote (-150.0 0.0)))
  16.                   (cons 40 300.0)
  17.                   (cons 41 50.0)
  18.                   (cons 42 0.0)
  19.                   (cons 10 (quote (100.0 0.0)))
  20.                   (cons 40 300.0)
  21.                   (cons 41 300.0)
  22.                   (cons 42 0.0)
  23.                   (cons 10 (quote (150.0 0.0)))
  24.                   (cons 40 0.0)
  25.                   (cons 41 0.0)
  26.                   (cons 42 0.0)))
  27.   (entmake (list
  28.               (cons 0 "ENDBLK")
  29.               (cons 100 "AcDbEntity")
  30.               (cons 100 "AcDbBlockEnd")
  31.               (cons 8 "0"))))
  32.  
  33. ;;; (named-testblock)
  34. ;;; (test "TestBlock")
  35.  
Название: Re: Ограничения entmakex
Отправлено: Александр Ривилис от 27-11-2018, 15:46:21
А если после создания 33000 анонимных блоков попробовать создать именованный, то при попытке вставки возвращается УДАЛЕННОЕ <EntityName>.
Думаю, что оно тут взаимосвязано с предыдущей ошибкой. Так что если они разберутся с ней, то эта уйдёт автоматически.
Название: Re: Ограничения entmakex
Отправлено: Александр Ривилис от 01-12-2018, 00:49:43
Баг подтвердили. Так что когда-нибудь исправят. :-)
Название: Re: Ограничения entmakex
Отправлено: Кирилл Никифоров от 03-12-2018, 10:53:08
Спасибо, Александр.
Жаль, надежды на исправление маловато...