Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Создание спецификации автоматически (Дубль2)
Диалог специалистов АВОК > ФАЙЛОТЕКА СПЕЦИАЛИСТА > Программы, расчеты
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
Supermax
Что-то ты совсем "зачах" я смотрю. Прямо сквозит унынием в твоих ответах. Надо тебе "угольку" подкинуть.
Динамические блоки, или нет, тут не причем. У тебя блок совсем не динамический, а простой. Он в анонимный перешел вместе со всей графикой, а потом его обратно именованным сделали. Ну и что, что он свойства потерял? Разве о них речь? Речь об объектах, которые не видны в модели, но есть в блоке. В простом блоке. Надо сравнить их потроха с такими же но только видимыми и узнать, что их видимость нарушает. Потом попробовать сделать это специально. Да там простой текст лежит от моей рекламы. Что в нем может быть такого необычного? А ить не видно его в модели однако.

VVA совсем заработался. Равнялку блоков никак не доделает, хотя я ему отстег обещал за это дать. Я длины в дин. блоках проиндексировал и без макроса. Но равнялка нужна все равно. Дальше вопрос застрял с позициями и нумерацией. Застрял также вопрос с модернизацией включения видимости объектов.

Ты скользкий тип, ни разу не сказал мне изменилось твое отношение к этой затее или нет. Судя по тому, что ты меня еще не бросил, изменилась. Ну тогда давай обсуждать заново идеологию. Я например многое пересмотрел в своих взглядах на мир. Ты ведь видишь, что виртуальное изделие это не только данные о товаре, а еще и возможность быстрого изменения объекта. Возьмем скажем болт. Динамический блок, содержащий в себе графику всего госта "легким поглаживанием" становится любой длинны и диаметра. ОДИН блок и все болты навсегда исчезли как отдельные элементы. Один блок ФБС и навсегда отпала необходимость рисовать ФБС-ки. Ну и данные тоже весьма полезны.
Короче, резюмируй свое отношение к идее в настоящий момент.

Со счетом ты разберешься, я в тебя верю.

Осталось совсем немного. Создать набор элементов в которых проставлены и позиции и номера и стадии строительства и разделы проекта. Так, а их-то кто проставлять будет?

Я тут скачал прогу, так она мне идею подкинула. Начинается с панели кнопок. Они все одинакового размера и текст внутри. "Выравнивание длин"; "Аудит состава атрибутов"; "Аудит состава свойств"; "Настройка альтернативных имен свойств и атрибутов"; "Простановка позиций"; "Простановка номеров"; "Настройка таблицы очередности"; ну и еще что-нибудь и "Расчет спецификации".

kpblc
Насчет смены видимости - я полагаю (подробно не исследовал), что это как раз связано с потерей динамичности блока. То есть с потерей словаря, который и отвечает за соответствие "значение параметра <-> значение видимости элемента". Простой текст или не текст - дело десятое. А вот для "полного" копирования и "перевставки" блока можно попробовать сделать так (вдобавок без работы со словарями wink.gif):
Код
(defun test (/ adoc ent blk lst ins)
  (vl-load-com)
  (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
  (if
    (and
      (= (type (setq ent (vl-catch-all-apply
               '(lambda () (car (entsel "\nУкажите блок <Отмена> : ")))
               );_ end of vl-catch-all-apply
             );_ end of setq
           );_ end of type
     'ename
     );_ end of =
      (setq ent (vlax-ename->vla-object ent))
      (= (vla-get-objectname ent) "AcDbBlockReference")
      );_ end of and
     (progn
       (vla-startundomark adoc)
       (setq blk (vla-add (vla-get-blocks adoc)
              (vla-get-origin
                (vla-item (vla-get-blocks adoc) (vla-get-name ent))
                );_ end of vla-get-origin
              "*U"
              );_ end of vla-add
         lst ((lambda (/ res)
            (vlax-for subent
                  (vla-item (vla-get-blocks adoc) (vla-get-name ent))
              (if (equal (vla-get-visible subent) :vlax-true)
            (setq res (cons subent res))
            );_ end of if
              (reverse res)
              );_ end of vlax-for
            );_ end of lambda
          )
         );_ end of setq
       (vla-copyobjects
     adoc
     (vlax-make-variant
       (vlax-safearray-fill
         (vlax-make-safearray
           vlax-vbobject
           (cons 0 (1- (length lst)))
           );_ end of vlax-make-safearray
         lst
         );_ end of vlax-safearray-fill
       );_ end of vlax-make-variant
     blk
     );_ end of vla-copyobjects
       (setq ins (vla-insertblock
           (vla-objectidtoobject adoc (vla-get-ownerid ent))
           (vla-get-insertionpoint ent)
           (vla-get-name blk)
           (vla-get-xeffectivescalefactor ent)
           (vla-get-yeffectivescalefactor ent)
           (vla-get-zeffectivescalefactor ent)
           (vla-get-rotation ent)
           );_ end of vla-InsertBlock
         );_ end of setq
       (foreach    prop '("normal" "insertionpoint")
     (vlax-put-property ins prop (vlax-get-property ent prop))
     );_ end of foreach
       (vla-update ins)
       (vla-erase ent)
       (vla-regen adoc acallviewports)
       (vla-endundomark adoc)
       );_ end of progn
     );_ end of if
  );_ end of defun

---
Я тоже заработался smile.gif VB вкупе с .NET подвесил меня конкретно. Ну да ладно, это не особо интересно.
С остальными задачами - разбираюсь, как только время появляется.
Supermax
Kpblc, ты часом не валиком макросы пишешь?
Supermax
Еще вопрос, пока ты не забыл что тут в лиспе написал.
Есть такая штука в дин. блоке как lookup. Я заметил, что если даже убить все Stretch параметры, на которые завязаны строки этого lookup-a, то они все равно остаются видны в самом lookup-e, правда появляется восклицательный знак.
Скопировать lookup в другой блок, как есть, ничего не меняя - вот это было бы достижение. Ими вся таблица свойств делается и каждый раз ее набивать - мучение. Атрибуты копируются, а эти lookpop-ы нет.
Ты вот блок скопировал, а обменяться свойствами между блоками как?
Supermax
Еще появилась зараза. Как лиспом нажать стрелку вниз? Хочу сделать макрос (вынужден) заполняющий lookup-ы из экселя. Для этого надо из буфера вставлять данные (Ctrl-v) и давить на стрелку вниз. Идеалогия такова:
Запускаю макрос. В нем реатор на двойной и одинарный щелчки мыши. Двойной щелчек - это я открываю lookup, одинарный - это я ставлю курсор в ту позицию, с которой хочу начать заполнение lookup-a. Макрос включить при открытом lookup-e нельзя, но если он уже работает, то кто его остановит?
Дальше происходит автоматическое открытие нужного файла экселя и из ячейки А1 и в низ, то есть А2, А3 и так до первой пустой ячейки, считываются данные. Считал ячейку - Ctrl-v и стрелку в низ, считал следующую и опять Ctrl-v и стрелку вниз и т.д. считал ячейку - пусто - стоп.
Видимо надо копаться в системных переменных Windows. Там наверное должен быть буфер клавиатуры, куда записывать можно номер кнопки?

О-хо-хо, как мне пло-о-хо!
kpblc
Цитата(Supermax @ 27.10.2007, 13:39) [snapback]181792[/snapback]
Kpblc, ты часом не валиком макросы пишешь?

Не, я под Маяковского кошу smile.gif
Насчет lookup'a не догнал.
kpblc
По lookup'у. Получить-то я все смог, но вот с изменениями что-то не срастается пока. Ни в какую:( Понятно, что надо делать через entmod, но повторяющиеся записи меня нервируют.
На всякий случай вариант получения:
Код
(defun getlookup (name / _kpblc-conv-list-to-sublist dict lst)
            ;|
*    Получение списка возможных lookup-действий дин.блока
*    Параметры вызова:
    name    эффективное (Effective) имя блока
|;

  (defun _kpblc-conv-list-to-sublist (lst count / res loc_count)
                                ;|
*    Преобразование списка в список подсписков заданной длины
*    Параметры вызова:
    lst    обрабатываемый список
    count    длина подсписков
|;
    (cond
      ((not lst) nil)
      ((not count) lst)
      ((< (length lst) count) lst)
      (t
       (setq loc_count 0)
       (while (< loc_count count)
         (setq res       (append res (list (car lst)))
               lst       (cdr lst)
               loc_count (1+ loc_count)
               );_ end of setq
         );_ end of while
       (setq res (append (list res) (_kpblc-conv-list-to-sublist lst count)))
       res
       )
      );_ end of cond
    );_ end of defun

  (vl-load-com)
  (vlax-for item
            (vla-getextensiondictionary
              (vla-item
                (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
                name
                );_ end of vla-item
              );_ end of vla-getextensiondictionary
    (setq lst (cons (vlax-vla-object->ename item) lst))
    );_ end of vlax-for
  (mapcar
    '(lambda (dict)
       (cons
         (cdr (assoc 300 (entget dict)))
         (_kpblc-conv-list-to-sublist
           (mapcar 'cdr
                   (vl-remove-if-not '(lambda (x) (= (car x) 302)) (entget dict))
                   );_ end of mapcar
           (cdr (assoc 93 (entget dict)))
           );_ end of _kpblc-conv-list-to-sublist
         );_ end of cons
       );_ end of lambda
    (vl-remove-if-not
      '(lambda (x) (wcmatch (strcase (cdr (assoc 0 (entget x)))) "*LOOKUPACT*"))
      (mapcar
        'cdr
        (apply
          'append
          (mapcar '(lambda (a)
                     (vl-remove-if-not '(lambda (x) (= (car x) 360)) (entget a))
                     );_ end of lambda
                  (vl-remove-if-not
                    '(lambda (x)
                       (wcmatch (strcase (cdr (assoc 0 (entget x)))) "*EVAL*")
                       );_ end of lambda
                    lst
                    );_ end of vl-remove-if-not
                  );_ end of mapcar
          );_ end of apply
        );_ end of mapcar
      );_ end of vl-remove-if-not
    );_ end of mapcar
  );_ end of defun

Пример вызова:
Код
(getlookup (vla-get-EffectiveName (vlax-ename->vla-object(car(entsel)))))
Supermax
Все прочел, спешу в налоговую, решай проблему со счетом.
Supermax
К стати, установил себе DOSLib 7,8. Теперь могу и команды DOS-a из под лиспа запускать.
Код
http://download.mcneel.com/download.asp?email=lazebny@pelisker.ru&DownloadFileID=433&ID=doslib&LANGUAGE=en&CDKEY=

kpblc
DOSLib вообще-то не только для выполнения dos-команд предназначен. Библиотека удобная, но до определенного момента.
Supermax
Вау! Нам рекламку налепили, видать мы притягиваем внимание чье-то.
Открыл на DWG.RU тему про эмулирование нажатия клавиш из под Lisp-а. Ясно с помошью delphi или чего-нибудь еще. Если получится кого-нибудь раскрутить на такую прибамбасину, круто будет.
kpblc
Какую рекламку? Куда??
Насчет нажатия клавиш - ИМХО нереально, учитывая, что внутренние имена контролов окна lookup'a неизвестны, то есть обратиться к ним (ЯТД) по меньшей мере очень трудно.
Supermax
О! А рекламку сняли. Вчера красовалась в заголовке темы Sanyo, видать денег мало дали, всего на один день и хватило.
На счет клавиш - реально! Прочти первый пост на dwg.ru внимательно. Я делаю реактор на двойной клик мышкой. Первый двойной клик - смотрю в переменную, где я флажек ставлю, если его нет - устанавливаю и жду дальше, второй двойной клик - опять смотрю на переменную, а там уже флажок установлен (к примеру буква Т), вот тогда я начинаю работу с программой на Delphi написанной. Дальнейшее развитие событий распишу как только найду того, кто это сможет сделать.
kpblc
"Реактор на двойной клик" в AutoCAD'e, скорее всего, выбьет твой кад в аут после N (в ADT N=max20) вызовов. Можешь мне поверить, я на этом уже погорел.
Я тебе там в личке ответил, повторюсь здесь: ИМХО будет удобнее, проще и в результате устойчивее расковырять потроха дин.блоков и словарей, с ними связанных, и научиться их модифицировать.
Ведь никто не будет пытаться поменять текущий слой вызывая окно менеджера слоев? Проще сделать (setvar "clayer" <...>) или vla-put-activelayer. Здесь ситуация аналогична.
Supermax
Да кто против ковыряний? Я за двумя руками! Уже второй день всю работу динамлю, все ковыряю и ковыряю. А толку то - 0 (пока). Гляжу в думп - есть метод copy, запускаю его - не работает. Рядом любую линию - зпросто, а эти хреновины нивкакую. И в матрицу преобразовать тоже не получится, по той же причине.
Какие 20 раз? Запустили макрос - просит открыть lookup (это раз) один раз кликнули - поставили курсор в позицию и дважды по этой позиции кликнули (это два) - запустили распечатку во все ячейки, что ниже этой позиции. А ты про 20 говоришь blink.gif
Чего ты так этого боишься? Постановка задачи вообще универсальная и благородная - эмулировать нажатие клавиш из под лиспа. Что в этом плохого? Почему в delphi можно эмулировать, а в лиспе нельзя?
kpblc
Наверное, потому нельзя, что autolisp не для этого вообще-то предназначен. Сможешь на Delphi в одну строку уместить код ?
Код
(cdr (assoc 2 (mapcar 'cons '(1 2 3) '(4 5 6))))
; или
(assoc 2 (mapcar '(lambda(a b c) (list a (* b 10.) (/ c 16.))) '(1 2 3) '(4 5 6) '(7 8 9)))
Не думаю. Я еще раз говорю - надо пробовать менять словарь, напрямую, через entmod. Но, поскольку структура записи неясна совершенно, у меня пока не получилось качественного результата добиться. А то, что было, уже стер.
Supermax
Запарился я с этими lookup-ами!
Чисто мое мнение:
Есть свойства блока, а есть свойства элементов, входящих в этот блок. Каким-то образом свойства некоторых элементов, к котрым относятся:
AcDbBlockLookupActionEntity
AcDbBlockLookupParameterEntity
AcDbBlockStretchActionEntity
AcDbBlockLinearParameterEntity
AcDbBlockRotateActionEntity
AcDbBlockRotationParameterEntity
AcDbBlockVisibilityParameterEntity

Ну и еще с десяток из инструментов свойств блока.
Транслируют свои свойства в свойства блока.
Код

(vl-load-com)
(setq es (car (entsel)))
(setq ve (vlax-ename->vla-object es))
(setq DynPrs (vla-GetDynamicBlockProperties ve))
(setq props (vlax-variant-value DynPrs))
(setq lprs (vlax-safearray->list props))

; Список возможных значений всех свойств дин. блока

(setq all-lVals '() k -1)
(repeat countPrs
(setq k (1+ k) pr-k (nth k lprs))
(setq AlVals-k (vla-get-AllowedValues pr-k))
(setq val-k (vlax-variant-value AlVals-k))
; проверка правильности индексов массива (м.б. пустой массив)
(if (>= (vlax-safearray-get-u-bound val-k 1) (vlax-safearray-get-l-bound val-k 1))
(setq lVals (vlax-safearray->list val-k))
(setq lVals nil)
)
(setq all-lVals (append all-lVals (list lVals)))
)


Кроме этих объектов, других объектов, транслирующих свои свойства в свойства блока нет. Что бы ты не нарисовал, ни одна линия, или текст не отдадут свои значения свойств - блоку.
Мы пытаемся изменить свойства блоку, а надо пытаться изменить свойства этим объектам.
Но вот беда, описание этих объектов - тайна за 7-ю печатями. Даже у Полещука в AutoLispe и Visual Lispe в среде AutoCAD в таблице 6.1 стр. 318 таких объектов нет. Более того, если делать им vla-dump-object с префиксом Т и смотреть на применимые к ним методы, как выяснилось, не хотят некоторые методы работать с ними, хотя думп показывает, что должны. Copy в частности.
Ты говоришь снес свойства кому? Блоку? или им? Я вполне допускаю, что в словарь могут попасть свойства от этих элементов и ты можешь стереть эти записи, но как их туда вставить? Вставлять ведь надо в соответствии с данными этих элементов (чтоб им пусто было) А то будет не правильная запись, что может быть расценено аудитом как ошибка и исправлено.
Самое печальное, что большинство функций autolisp-a не знают таких объектов и отказываются с ними работать.
kpblc
И я тебе про то же самое и говорю. Мутное это дело - дин.блоки программно создавать или менять.
Дальше чистая логика, ничего более (хотя она подтверждена кодом в #507): дин.блоки работают через какой-то свой arx. Учитывая, что arx практически не умеет оперировать activex-представлением (основываюсь на высказывании А.Ривилиса в форуме autocad.ru), то логично предположить, что все данные хранятся в dxf-представлении. Соответственно с ним и работать надо.
по поводу отсутствия метода Copy. Этот метод допускает копирование графических примитивов, насколько я знаю. И не больше. Посмотри его описание. Если повезет, сработает CopyObjects, но я б на это не рассчитывал.
Supermax
Я думаю, что разработчики AutoCAD-a хотят, чтобы динамические блоки остались преимущественно только в AutoCAD-e и поэтому не дают программно с ними работать, что может открыть доступ к архитектуре динамических блоков.
kpblc
Я не знаю, чего они там хотят или не хотят. Но попробовать поиграться со словарями можно - мой вариант доступа "на чтение" есть, элементарный entget для объекта словаря покажет все его потроха. Думаешь, как я 507 нарисовал? Именно так и было.
Supermax
Да я тебе о чем? Я о том, что метод vla-dump-object дает
Код
Command: (vlax-dump-object (vlax-ename->vla-object (car (entsel))) T)
Select object:; IAcadBlockLookupActionEntity: IAcadBlockLookupActionEntity
Interface
; Property values:
;   ActionType (RO) = "Lookup"
;   Application (RO) = #<VLA-OBJECT IAcadApplication 00d74d3c>
;   Document (RO) = #<VLA-OBJECT IAcadDocument 01dfc3b0>
;   Handle (RO) = "406D"
;   HasExtensionDictionary (RO) = 0
;   Hyperlinks (RO) = #<VLA-OBJECT IAcadHyperlinks 0b631af4>
;   Layer = "0"
;   Linetype = "ByLayer"
;   LinetypeScale = 1.0
;   Lineweight = -1
;   Material = "ByLayer"
;   Name = "Lookup19"
;   ObjectID (RO) = 2126869160
;   ObjectName (RO) = "AcDbBlockLookupActionEntity"
;   OwnerID (RO) = 2130439416
;   PlotStyleName = "ByLayer"
;   Position = (-1470.17 759.448 0.0)
;   TrueColor = #<VLA-OBJECT IAcadAcCmColor 06b8e288>
;   Visible = -1
; Methods supported:
;   ArrayPolar (3)
;   ArrayRectangular (6)
;   Copy ()
;   Delete ()
;   GetBoundingBox (2)
;   GetExtensionDictionary ()
;   GetXData (3)
;   Highlight (1)
;   IntersectWith (2)
;   Mirror (2)
;   Mirror3D (3)
;   Move (2)
;   Rotate (2)
;   Rotate3D (3)
;   ScaleEntity (2)
;   SetXData (2)
;   TransformBy (1)
;   Update ()
T


А на деле Copy не работает. Не было бы ее в думпе - кто-б что-б говорил?
kpblc
Кхек... Ты ж указываешь на ручку Action, так? А я шел от описания блока, без вскрытия его. У меня - только словарь, у тебя - интерфейс доступа к нему. Интерфейс имеет графическое отображение, и поэтому имеет методы графических примитивов. А вот то, что они не определены для работы с ними программно - это уже отдельная песня. Кстати, как ты выполнял vla-copy?
Supermax
И всетаки я не понял, что ты ищешь в словаре?
Вот мы нарисовали линию. Все, больше ничего в файле нет. Что лежит в словаре - толщина, цвет, тип, а X, Y, Z начала и конца линии разве в словаре лежат? Это свойства самой линии. Как ты их изменишь ковыряясь в словаре? Есть свойства которые в словарях лежат, а есть свойства, которые лежат в описании объекта. Читать мы их можем, а изменить не зная архитектуру объекта и не имея инструмента для работы с этой архитектурой - нет.
Эти объекты создают в словаре, в той части, где лежит описание блока дополнительные сведения, которые и создают в свойствах блока то, что мы видим.
Ну это я так предполагаю, конечно.
Вот до них добраться теоритически можно, но что это дает? Испортить разве что.
kpblc
Цитата
Вот до них добраться теоритически можно, но что это дает?

Как что? Если ты до них добрался, то и поменять можно (теоретически). Только с умом надо менять, расковыряв до "винтика" не один и не два блока.
Supermax
(vla-Delete (vlax-ename->vla-object (car (entsel)))) работает
(vla-Copy (vlax-ename->vla-object (car (entsel)))) не работает
kpblc
Код
(vla-copy <Object> <Начальная точка копирования> <Конечная точка копирования>)
Supermax
Да я только предполагаю, что в словаре как и с толщинами и с типом линий и принадлежностью слою появляется еще дополнительная графа-словарь Custom
К стати, а где лежат General; 3D Visualization; Geometry и Misc? А?

Но предположение - это предположение и не больше.

Точки в каком виде?
kpblc
(vlax-3d-point '(0. 0. 0.))
Supermax
Код
(setq qq1 (vla-Copy (vlax-ename->vla-object (car (entsel))) (vlax-3d-point '(0. 0. 0.)) (vlax-3d-point '(10. 10. 10.))))


Select object: ; error: Too many actual parameters
kpblc
Ну извини. Справку посмотрел, там просто выполняется дублирование примитива. Так что последовательность примерно такая:
Код
_$ (setq ent (vlax-ename->vla-object (car(entsel))))
#<VLA-OBJECT IAcadLine 0fe60d94>
_$ (setq start (getpoint "\nНачальная точка ") end (getpoint start "\nКонечная точка "))
(364.428 37.4352 0.0)
_$ (mapcar '(lambda(x) (vlax-safearray->list (vlax-variant-value (vlax-get-property ent x))))
'("startpoint""endpoint"))
((193.906 66.3907 0.0) (288.687 187.176 0.0))
_$ (setq ent2 (vla-copy ent))
#<VLA-OBJECT IAcadLine 0fe61394>
_$ (vla-move ent2 (vlax-3d-point start) (vlax-3d-point end))
nil
_$ (mapcar '(lambda(x) (vlax-safearray->list (vlax-variant-value (vlax-get-property ent2 x))))
'("startpoint""endpoint"))
((331.731 34.5397 0.0) (426.511 155.325 0.0))
_$

Но это сделано с обычным графическим примитивом - отрезком. Ты же пытаешься работать с тем, "чего нет".
---
Добавлено: И какой смысл копировать Action, если тебе надо внутри Action'a модифицировать данные?
Supermax
Так с простым элементом и просто (vla-Copy (vlax-ename->vla-object (car (entsel)))) работает на ура.
Вот в блоке тыкаю в плоскость - дает vla-объект тыкаю в lookup - сам понимаешь - не дает.
Хотя Copy () есть в допустимых методах. huh.gif

Хорошо, начнем с элементарного: Где описаны закладки свойств элемента? Ну свойства открой и названия почитай.
kpblc
Вопроса напрочь не понял.
Supermax
Код
(mapcar '(lambda(x) (vlax-safearray->list (vlax-variant-value (vlax-get-property ent x))))
;Пропустил одну скобку
)


И эта строчка сразу выдает:
; error: too few arguments

По поводу вопроса:

Все свойства в блоках классифицированы на разные группы:

General
3D Visualization
Geometry
Misk
и добаляется еще в дин блоках
Custom

Вопрос:

Где лежат эти пакеты? Я так понимаю, что часть свойств в этих группах - описание из словарей, часть из свойств элемента. Скорее всего есть такое место, куда попадает выборка свойств и скорее всего это таблица.
kpblc
Цитата(Supermax @ 30.10.2007, 18:43) [snapback]183163[/snapback]
Код
(mapcar '(lambda(x) (vlax-safearray->list (vlax-variant-value (vlax-get-property ent x))))
;Пропустил одну скобку
)


И эта строчка сразу выдает:
; error: too few arguments

Да ничего я не пропустил, там код на 2 строки раскинут - обрати внимание!
Код
(mapcar '(lambda(x) (vlax-safearray->list (vlax-variant-value (vlax-get-property ent2 x)))) '("startpoint""endpoint"))

и
Код
(mapcar '(lambda(x) (vlax-safearray->list (vlax-variant-value (vlax-get-property ent2 x))))
'("startpoint""endpoint"))

Разница есть? Не-а...
Supermax
Теперь выдает:
; error: ActiveX Server returned the error: unknown name: startpoint
kpblc
Покажи, чего вернет (vla-get-objectname ent2) (подозреваю, что ты сразу последний вариант применяешь)
Supermax
Код
(setq ent2 (vla-copy ent))

Возвращает в случае с lookup-ом
; error: Automation Error. Description was not provided.
В случае с простым примитивом
Код
#<VLA-OBJECT IAcadEntity 01f4ecac>


А просто (vla-get-objectname ent)

Выдает "AcDbBlockLookupActionEntity" в случае с lookup-ом и "AcDbBody" хрень какая-то от графики блока.
Supermax
Во, вспомнил, я когда воевал с внешними ссылками все время путался с таблицами, у которых тоже название влаобъекта, что и у самой ссылки. Может поискать одноименные таблицы к этим элементам блока?
Supermax
Про копирование Action-а: Да не надо мне его копировать, просто наткнулся на такую беду и думаю, а не зарыто ли тут зерно истины? Ниточку ищу, за которую надо потянуть. Вот нашел, потянул, а она оборвалась, зараза.
Supermax
Так, знаменитой vlax-for взломал файл. В Моделспейс - ("AcDbBlockReference")
в Блокс - ("AcDbBlockTableRecord" "AcDbBlockTableRecord" "AcDbBlockTableRecord"
"AcDbBlockTableRecord" "AcDbBlockTableRecord")
Пять таблиц которые принадлежат:
Код
(#<VLA-OBJECT IAcadBlock2 0b768794> #<VLA-OBJECT IAcadBlock2 0b768744>
#<VLA-OBJECT IAcadBlock2 0b7686f4> #<VLA-OBJECT IAcadPaperSpace2 0b7686a4>
#<VLA-OBJECT IAcadModelSpace2 0b7683d4>)

На один несчастный блок аж три таблицы. С чем?
Supermax
Так, три это два лэйаута и модель один *U2 и один таблица к существующему блоку
Supermax
Kpblc, смотрю, уже домой добрался, да? Как таблицы прочесть?
kpblc
Стоп, ты на чем исследования-то проводишь? Образец пришли, попробую посмотреть (боюсь, только завтра).
Supermax
Так, вот имена (vla-get-name ...)

("*U2" "Отвод Ст 159х4.5-1-ППУ-ПЭ" "*Paper_Space0" "*Paper_Space"
"*Model_Space")

Ты сечешь, у меня файл и в нем один единственный динамический блок
Я его вскрываю
Код
(defun _kpblc-get-all-AcDbBlockLookupActionEntity-with-Blocks ( / )
(vl-load-com)
(setq res3 nil)
(vlax-for blk_def
;(vla-get-ModelSpace (vla-get-activedocument (vlax-get-acad-object)))
(vla-get-Blocks (vla-get-activedocument (vlax-get-acad-object)))
;(if  
;(= (vlax-get-property blk_def 'ObjectName) "AcDbBody")
;(= (vla-get-objectname blk_def) "AcDbBody")
(setq res3 (cons (vla-get-name blk_def) res3));)
);_ end of vlax-for
);_ end of defun. В переменной res3 - результат в виде списка vla-объектов


Ну тут на все случаи жизни
и получаю в данный момент 5 таблиц где name следующие
("*U2" "Отвод Ст 159х4.5-1-ППУ-ПЭ" "*Paper_Space0" "*Paper_Space"
"*Model_Space")

Обрати внимание на звездочки перед именами


Supermax
И что это за "*Paper_Space0"?
kpblc
Ну извини, но рассказывать то, что есть у Полещука, я не считаю верным.
А чего тебя зведочки так напрягли? Думаю, более интересным будет вариант
Код
(defun test (/)
  (mapcar
    '(lambda (x)
       (princ
         (strcat "\n"
                 (vla-get-objectname x)
                 " : "
                 (vla-get-name x)
                 (if (and (equal (vla-get-hasextensiondictionary x) :vlax-true)
                          (> (vla-get-count (vla-getextensiondictionary x)) 0)
                          );_ end of and
                   " : has dict **"
                   ""
                   );_ end of if
                 "**"
                 );_ end of strcat
         );_ end of princ
       );_ end of lambda
    ((lambda (/ lst)
       (vlax-for blk
                 (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
         (setq lst (cons blk lst))
         );_ end of vlax-for
       );_ end of lambda
     )
    );_ end of mapcar
  (princ)
  );_ end of defun

Обрати внимание на словарные записи (точнее, их наличие)
Supermax
Совершенно случайно, рывшись на форуме AutoDesk-a

http://discussion.autodesk.com/thread.jspa?messageID=5069675

Я нашел вот это:
Перевел автоматическим переводчиком и ахнул.

Цитата
1) Нет никакого выставленного программного ИНТЕРФЕЙСА приложения для создания динамичных блоков. Я имею
как минимум двух клиентов, которые имеют большие библиотеки блоков, которые представляют
их ассортимент изделий. Эти компании могли извлечь выгоду очень из использования
динамичных блоков. Однако, не экономично для них вручную
добавить надлежащих параметров к свыше 15,000 блоков. Логика для
дополнения 'Parametrics' могла программироваться но нет никакого программного ИНТЕРФЕЙСА приложения
, чтобы сделать так. Я предполагаю, что один мог написать сценарий процесса (хотя я буду держать пари, я
нарвался бы на некоторые главные мертвые концы для некоторых вещей, которые только имеют интерфейсы диалога

2) Почему - там предел (из 1) к числу параметров видимости?
Мне нужно быть способным проецировать многоразовые параметры видимости на различные
выборы продукта. Этот один означает, что я не могу рекомендовать динамичные блоки к моим
клиентам, которым нужно это функциональность sad.gif

Кто-либо кроме разочаровал с динамичными блоками от перспективы API?

В случае, если вы не сунули нос в чужие дела acdb16.dll за 2006, здесь есть короткий список
того, что мы пропускаем:

AcDbBlock1PtParameter
AcDbBlock1PtParameterEntity
AcDbBlock2PtParameter
AcDbBlock2PtParameterEntity
AcDbBlockAction
AcDbBlockActionEntity
AcDbBlockActionEntityWithBasePt
AcDbBlockActionWithBasePt
AcDbBlockAlignmentGrip
AcDbBlockAlignmentGripEntity
AcDbBlockAlignmentParame t er
AcDbBlockAlignmentParameterEntity
AcDbBlockArrayAction
AcDbBlockArrayActionEntity
AcDbBlockBasepointParameter
AcDbBlockBasepointParameterEnti t y
AcDbBlockElement
AcDbBlockElementEntity
AcDbBlockElementEntityMgr
AcDbBlockFlipAction
AcDbBlockFlipActionEntity
AcDbBlockFlipGrip
AcDbBlockFlipGripEntity
AcDbBlockFlipParameter
AcDbBlockFlipParameterEntity
AcDbBlockGrip
AcDbBlockGripEntity
AcDbBlockLinearGrip
AcDbBlockLinearGripEntity
AcDbBlockLinearParameter
AcDbBlockLinearParameterEntity
AcDbBlockLookupAction
AcDbBlockLookupActionEntity
AcDbBlockLookupGrip
AcDbBlockLookupGripEntity
AcDbBlockLookupParameter
AcDbBlockLookupParameterEntity
AcDbBlockMoveAction
AcDbBlockMoveActionEntity
AcDbBlockParamValueSet
AcDbBlockParameter
AcDbBlockParameterEntity
AcDbBlockPointParameter
AcDbBlockPointParameterEntity
AcDbBlockPolarGrip
AcDbBlockPolarGripEntity
AcDbBlockPolarParameter
AcDbBlockPolarParameterEntity
AcDbBlockPolarStretchAction
AcDbBlockPolarStretchActionEntity
AcDbBlockRotateAction
AcDbBlockRotateActionEntity
AcDbBlockRotationGrip
AcDbBlockRotationGripEntity
AcDbBlockRotationParameter
AcDbBlockRotationParameterEntity
AcDbBlockScaleAction
AcDbBlockScaleActionEntity
AcDbBlockStretchAction
AcDbBlockStretchActionEntity
AcDbBlockVisibilityGrip
AcDbBlockVisibilityGripEntity
AcDbBlockVisibilityParameter
AcDbBlockVisibilityParameterEntity
AcDbBlockXYGrip
AcDbBlockXYGripEntity
AcDbBlockXYParameter
AcDbBlockXYParameterEntity


Best regards,

Byron Blattel
CADwerx--Applications for AutoCAD
Autodesk Registered Developer
Contact Info @ http://www.cadwerx.net
Custom Programming Services - ObjectARX/C++/MFC/ASP/STL/ATL/ISAPI...


Короче, не я один оказывается такой вумный. И это датировано прошлым годом.
kpblc
Ну и? Через API, тем более с использованием .NET, добраться до состава параметра типа lookup, по-моему, невозможно. Даже на предмет прочитать. Лиспом - возможно, хотя и через пятую точку.
Supermax
Дык, я что не понимаю? Читать мы уже читаем, а чтобы сформировать новое значение или скопировать вла-объект в другой блок - только через эмуляцию действий руками. Во всяком случае - это верняк, что получится.
И ты заметь, скользкий ты наш, что идея создания виртуальных изделий на основе динамических блоков летает в воздухе уже с начала 2006 года.
Kpblc, попробуй взять блок и найти в нем все его составляющие вплоть до линий и текста. Не найдутся ли при этом эти чертовы объекты? Если найдутся, то нельзя ли их тупо скопировать в другой блок, лежащий в этом же файле?
И потом, я, чтобы облегчить себе жизнь не копировал свойства из блока в блок, а копировал графику в блок со свойствами, который потом переименовывал. Подумай, нельзя ли сделать это конвейером?
К стати окна в блоке можно создавать программно через Command и префикс "-" Работает.

Еще вопрос (вдруг знаешь) Можно ли конкретное окно (c lookup-oм) установить жестко на конкретную позицию пространства экрана? Оно сейчас перетаскивается туда-сюда. А, помню, есть переменная AutoCAD-a которая отвечает за это.
Supermax
Да, к сожалению нет такого метода, как добавление вла-объекта, а то можно было бы.
Есть вторичные свойства, а есть первичные. Ничего нам не даст изменение вторичных свойств. Надо пытаться изменить первичные. И помоему мы просто слепы. Кроме пространства модели и лэйаутов есть наверное пространство блока. Только его не так обозначили и vlax-dump-object его не видит. Методы дают нам возможность вставлять в блок примитивы, но мы по прежнему пространство самого блока не видим. Иначе бы мы могли через vlax-for увидить список элементов каждого блока. Или я совсем сошел с ума.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2025 IPS, Inc.