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

К стати объясни, будь добр, от куда брать ent?
kpblc
Как откуда? Из набора, который ты создал до этого.
Supermax
Мне нужен список DXF пары -1 из пространства модели. Чтобы это значение совпадало со значением, получаемым (entget (car (ensel))).
Через функцию (tblobjname "block" (car (acet-table-name-list "block"))) дает не те значения. В набор не лезут. DXF код -2 в набор лезет, но ручки включать не хочет.
То что ты мне дал я и так знаю. Я весь dump перековырял и даже в М.S. Project дерево с раскрывающимися подразделами сделал. И что? Имен нет и vla-объектов вставленных элементов тоже. Тыкаешь на простой или динамический блок - есть, а на ссылку - дуля с маком.
kpblc
Слушай, я сейчас начну шипеть и плеваться.
Ты путаешь описания блоков и вхождения блоков. Зачем тебе DXF, если и без него неплохо живется?
P.S. Полный код все равно не покажу пока - добро не получено.
Supermax
Вскрываю не документированные функции. Уже много вскрыл. Надо куда-нибудь скидывать результат. На DWG-RU может, в AutoLisp директорию? Но там нет специального раздела по недокументированным функциям.
kpblc
Это какие же функции недокументированы?
---
Добавлено: Но тему-то создать никто не запрещает wink.gif
Supermax
kpblc, тема не катит. надо _lspdump развернуть и все функции сделать кнопками. Тыкаеш в функцию - раскрывается окошко с ее описанием. Полещуку это навеное не понравится. А может и понравится. Надо спросить. Я ему на сайт уже начал это делать. Только как оглавление к его книге. А вот не документированные - это дело интересное. Угрожающим заголовкам в лип-файлах не противоречат.
Я например надыбал, что не все функции подгружены, из тех, что в лисп-файлах лежат. А там есть такие, что очень даже пригодились бы. Только описывать их надо по какой-то системе, и куда-то складывать. Эту прозу должен контролировать модератор, то есть через него все должно фильтроваться. Ты сечешь куда клоню?
Могу поделиться уже почищенным думп-файлом.
kpblc
Цитата
Тыкаеш в функцию - раскрывается окошко с ее описанием

Я таким точно пользоваться не буду. Есть VBA-шная справка, ее достаточно.
Цитата
А вот не документированные - это дело интересное

Что за недокументированные функции, я так и не допетрил. Есть некоторые функции ET, благополучно перекочевавшие в ядро AutoCAD'a, есть некоторые особенности поведения, но недокументированных лично я не могу вспомнить. Приведи хотя бы один пример.
Цитата
Я например надыбал, что не все функции подгружены, из тех, что в лисп-файлах лежат. А там есть такие, что очень даже пригодились бы.

Это про какие лисп-функции (файлы) сейчас разговор? Или вопрос в автозагрузке всех этих лиспов? Если второе - сходи, например, сюда (сам пользуюсь аналогом этого), или сюда. Вариантов по автозагрузке много.
Цитата
Только описывать их надо по какой-то системе, и куда-то складывать.
"САПР на базе AutoCAD - как это делается. Там все это очень неплохо описано. Если не в ломак, скачай у меня CADWare (это не в порядке рекламы), установи и посмотри, как лиспы лежат. Хотя сейчас там уже многое поменялось, но система осталась прежней. Практически.
---
Добавлено: там при установке на 2006 слетали иногда менюхи, так что не пугайся. Если что - пиши, скажу чего надо сделать
---
Цитата
Ты сечешь куда клоню?
Не-а, я сегодня тупой smile.gif
Цитата
Могу поделиться уже почищенным думп-файлом.
Давай. А то, опасываюсь, скоро мне придется здесь пищать нечто типа: "Куплю оверлок. Можно б/у. Можно сломанный. Хоть узнаю, что это такое" wink.gif
Supermax
Kpblc, ты не обижайся, но тебе нужно было не программистом, а в театральный. Очень уж ты любишь на публику работать. Ладно, для публики:
Не документированная команда (ну, Полещук ее задокументировал однако) _lspdump создает текстовый файл с расширением .dmp а имя файла соответствует имени файла .dwg, открытого у вас в это время в каде, где перечисляются все загруженные на данный момент функции и созданные глобальные переменные (с их значением разумеется).
Переименовав расширение на .txt читаем:
Все строки начинающиеся с ; - функции лиспа в виде сохраняемого макроса под глобальным именем
;(setq ACET-INSERT-ATTRIB-GET #<SUBR @07fec3fc ACET-INSERT-ATTRIB-GET> ) типа этого
следует очень длинный список и далее
(setq ACARROWORIGIN2 8)
следуют списки имен переменных и занесенные в них значения.
Этот думп-файл, как я его называю, - дышит. Каждый раз, как вы создаете переменную, или функцию, она сюда попадает (ну после перезапуска _lspdump разумеется).
Берем открываем в Program Files/AutoCAD.../ папочку /Express/ Выделяем все файлы с расширением .lsp и копируем их в буфер обмена. Создаем себе где-нибудь новую папочку и вставляем их туда. Затем, долго и упорно переименовываем их из .lsp в .txt.
Выходим из этой папочки и выделив ее мышкой, нажимаем правую кнопень мышки, в выпавшем меню выбераем "найти" и вставляем имя интересующей на функции в окошко "слово в файле" в окошке "имя файла" ставим *.*.
Поиск мгновенно находит те лиспы, в которых она применяется и по тому, как она использована можно легко определить и количество и значение ее аргументов.
Пример:
(acet-table-name-list "block") "block" - это имя таблицы, как и "layer", и многие другие
по таким вот строчкам:
(setq lst (acet-table-name-list (list "block" 1 4 16))) ;exclude anonymous and xref blocks
даже тупой осел поймет, что функция может фильтровать выдаваемое содержимое.
Тем, кто имеет напряг с английским могу порекомендовать автоматический переводчик
http://pereklad.online.ua/ загружаете туда весь текст и переводите нажав кнопень "перевести".
Вернемся к функции - выдает список имен всех (ну чего там указали) типа блоков к примеру, включая внешние ссылки и прочее.
Supermax
Продолжу. Автозагружать всю эту хрень - упаси бог! А вот поковырятся в ней - самое оно. С автопереводчиком за пару секунд все переводишь и понимаешь, даже если и без него половину можешь прочесть, но то-ж половину, а надо все.
Выкладывать эти лиспы на тему нельзя. Там ясно сказано - Правительство США ограничело свободное копирование и использование ... и так далее. Чтоб им рубль на голову упал!
Supermax
Есть к примеру переменная *LAST-VALUE* (звездочки ее собственные). В переводе на наш великий и могучий - "последнее значение". Создается автоматически и она содержит значение последней сохраненной переменной. Поясню: Коммандой setq создавали и создавали, и переписывали разные переменные, но какая-то последняя сохранилась. Когда создаешь коммандой (set (... переменную с изменяемым программно именем и если в значение этой переменной вставить хотя бы часть (изменяемую) этого имени, то при помощи переменной *LAST-VALUE* всегда можно узнать и "что" записано и ориентировку "куда" записано.
Supermax
Kpblc, ты-ж модератор на dwg-ru, чего скрывать? Все знают это. Вот тебе и карты в руки. Собирай от разных челов инфу про эти функции и складывай в копилку. Только не у себя дома. Тебе, как программисту будет очень полезно. Полещук (опять Полещук, ну и что? Раз нету больше на кого сослаться?) правда говорит, что это очень трудное занятие - разбираться с недокументированными функциями, но полезное - однозначно.
kpblc
Цитата
Kpblc, ты не обижайся, но тебе нужно было не программистом, а в театральный. Очень уж ты любишь на публику работать.

Ну есть, наверное, такое. Хотел ситуацию немного разрядить, надеюсь, удалось smile.gif
_lsdump, наверное, интересная команда. Но я как-то привык работать с (atoms-family), мне инфы от него хватало - она ж, собака этакая, как правило, требуется "здесь и сейчас, пока мысля не уползла". Но за инфу спасибо, сегодня попробую smile.gif Кстати, acadinfo, по-моему, выполняет аналогичные действия. И, кстати, еще и системные переменные выводит smile.gif
---
Добавлено: Попробовал. Пока останусь, наверное, на старом.
---
ET, к сожалению, не безгрешны. Есть у них и свои баги, которые отловить "снаружи" достаточно тяжко зачастую. Кроме того, ET в AutoCAD LT запустить иногда становится невозможно - LT Extender, которым я пользуюсь, по непонятным причинам иногда просто отказывается загружать fas. Чего ему не нравится - неясно. А работать надо wink.gif
Продолжу smile.gif
Цитата
Автозагружать всю эту хрень - упаси бог! А вот поковырятся в ней - самое оно.

Нда? Кхе, найди, ради интересу, описание (в смысле defun) acet-error-init - он у них стандартный обработчик ошибок, судя по наименованию. Лично у меня описания не обнаружено. Ни в каком виде. И прально, оно болтается в одном из acedutil*.fas. Я уже говорил, и еще раз повторю - дизассемблировать эти файлы я отказываюсь напрочь.
*LAST-VALUE* использую, кстати, только в отладочных целях. Делать на нее ставку я б не стал - обращаться к ней надо отдельно. А зачем, если есть пользовательские переменные? К ним обращение ИМХО более удобно. Но спорить не буду.
Цитата
Kpblc, ты-ж модератор на dwg-ru, чего скрывать? Все знают это. Вот тебе и карты в руки. Собирай от разных челов инфу про эти функции и складывай в копилку. Только не у себя дома. Тебе, как программисту будет очень полезно. Полещук (опять Полещук, ну и что? Раз нету больше на кого сослаться?) правда говорит, что это очень трудное занятие - разбираться с недокументированными функциями, но полезное - однозначно.

Ну да, я там модер. И что? Понимаешь, недокументированные функции, судя по форумам и лиспам, которые и публикуются, и обсуждаются, и (чего греха таить) мне присылаются - в лиспе не используются. Устаревшие - да (в частности, vla-get-color и vla-put-color - официально их дальнейшая судьба неизвестна, но, пока есть AIC, они наверняка будут здравствовать). Недокументированные функции чаще используются в ObjectARX, да и там на них особо не обопрешься (сужу по личному общению с А.Н.Ривилисом по аське).
Разбираться с недокументированными функциями - дело полезное, конечно. Но (как бы сказать-то, чтоб никто не обиделся) - лично мне оно пока не требуется. Мне зачастую более важно поведение AutoCAD'a на стандартных функциях.
Там-то тоже проколов полно - начиная от особенностей вставки анонимных и динамических блоков и таблиц и заканчивая недокументированными (официально) моментами ObjectDBX-интерфейса.
И последнее. Если хочешь, я могу тебе накатать код, который для указанного примитива (или списка примитивов, или набора) покажет все его (их) свойства? Хотя чего я спрашиваю - лови:
Код
(defun _kpblc-get-properties-and-methods (ent / res lst_prop lst_meth)

  (defun loc:conv-to-vla (ent / res tmp)
    (if (not (vl-catch-all-error-p
               (vl-catch-all-apply
                 '(lambda ()
                    (setq res (cond
                                ((= (type ent) 'ename)
                                 (setq ent (vlax-ename->vla-object ent))
                                 )
                                ((= (type ent) 'vla-object) ent)
                                ((= (type ent) 'str)
                                 (if (not (vl-catch-all-error-p
                                            (vl-catch-all-apply
                                              '(lambda ()
                                                 (setq tmp
                                                        (vlax-ename->vla-object (handent ent))
                                                       );_ end of setq
                                                 );_ end of lambda
                                              );_ end of vl-catch-all-apply
                                            );_ end of vl-catch-all-error-p
                                          );_ end of not
                                   tmp
                                   );_ end of if
                                 )
                                ((= (type ent) 'list)
                                 (vlax-ename->vla-object (cdr (assoc -1 ent)))
                                 )
                                );_ end of cond
                          );_ end of setq
                    );_ end of lambda
                 );_ end of vl-catch-all-apply
               );_ end of vl-catch-all-error-p
             );_ end of not
      res
      );_ end of if
    );_ end of defun

  (setq lst_prop (acad_strlsort
                   (mapcar '(lambda (a)
                              (substr a 9)
                              );_ end of lambda
                           (vl-remove-if-not
                             '(lambda (x) (wcmatch (strcase x) "VLA-GET*"))
                             (atoms-family 1)
                             );_ end of vl-remove-if-not
                           );_ end of mapcar
                   );_ end of ACAD_STRLSORT
        lst_meth (acad_strlsort
                   (mapcar '(lambda (a)
                              (substr a 5)
                              );_ end of lambda
                           (vl-remove-if-not
                             '(lambda (x)
                                (and (wcmatch (strcase x) "VLA-*")
                                     (not (wcmatch (strcase x) "VLA-GET-*"))
                                     );_ end of and
                                );_ end of lambda
                             (atoms-family 1)
                             );_ end of vl-remove-if-not
                           );_ end of mapcar
                   );_ end of ACAD_STRLSORT
        ent      (cond
                   ((and (= (type ent) 'list) (cdr (assoc -1 ent)))
                    (list (loc:conv-to-vla ent))
                    )
                   ((member (type ent) (list 'ename 'vla-object))
                    (list (loc:conv-to-vla ent))
                    )
                   ((= (type ent) 'pickset)
                    (mapcar 'loc:conv-to-vla
                            (vl-remove-if 'listp (mapcar 'cadr (ssnamex ent)))
                            );_ end of mapcar
                    )
                   ((= (type ent) 'list)
                    (mapcar 'loc:conv-to-vla ent)
                    )
                   );_ end of cond
        res      (mapcar
                   '(lambda (x)
                      (list
                        (cons
                          "properties"
                          (vl-remove
                            'nil
                            (mapcar
                              '(lambda (a / res)
                                 (if (vlax-property-available-p x a)
                                   (cond
                                     ((not (vl-catch-all-error-p
                                             (vl-catch-all-apply
                                               '(lambda ()
                                                  (setq
                                                    res (cons a (vlax-get-property x a))
                                                    );_ end of setq
                                                  );_ end of lambda
                                               );_ end of vl-catch-all-apply
                                             );_ end of vl-catch-all-error-p
                                           );_ end of not
                                      res
                                      )
                                     (t
                                      (cons a "ERROR: Блин, мало данных для получения!")
                                      )
                                     );_ end of cond
                                   );_ end of if
                                 );_ end of lambda
                              lst_prop
                              );_ end of mapcar
                            );_ end of vl-remove
                          );_ end of cons
                        (cons "methods"
                              (vl-remove-if-not
                                '(lambda (a) (vlax-method-applicable-p x a))
                                lst_meth
                                );_ end of vl-remove-if-not
                              );_ end of cons
                        );_ end of list
                      );_ end of lambda
                   (vl-remove 'nil ent)
                   );_ end of mapcar
        );_ end of setq
  res
  );_ end of defun

Функция принимает на вход всего один параметр - это может быть ename- или vla-указатель на примитив, строка (воспринимается как хендл примитива), список (entget), список примитивов (в любом из предыдущих представлений, возможно смешанное представление) или набор примитивов, полученный через (ssget). Что возвращает - сам посмотри. Только эта функция на самом деле не больше чем гимнастика ума, так сказать. Реальной области ее применения я не вижу (как правило, требуется более конкретное решение).
Supermax
Помусорю немного.
Функция шеснадцатиричного счетчика:
(st-16 <аргумент>)
<аргумент> - любое отличное от nil значение (строка, цифры, выражения и пр.)

Возвращает строку с постоянно увеличивающимся шестнадцатиричным кодом на 6 позиций от "000000" до "ffffff" (от запуска функции к ее следующему запуску). Хранит значения "колесиков" в переменных st-a, st-b, .... st-f.

Применение:
Вставляется в циклические функции как элемент генерации нового значения переменной или части аргумента. Для переключения счетчика на новое значение, при запуске функции ее аргумент не должен быть равен nil. При значении аргумента nil - выводит строку с существующим значением счетчика.

Использование:
Перебор значений меток на предмет обнаружения положительного отклика функцией vla-HandleToObject и других хакерских штучек.

Код
(defun st-16 (x / )
(if (and st-a st-b st-c st-d st-e st-f) T (setq st-a 0 st-b 0 st-c 0 st-d 0 st-e 0 st-f 0))
(if x
(if (<= st-a 14) (setq st-a (1+ st-a)) (progn (setq st-a 0)
(if (<= st-b 14) (setq st-b (1+ st-B)) (progn (setq st-b 0)
(if (<= st-c 14) (setq st-c (1+ st-c)) (progn (setq st-c 0)
(if (<= st-d 14) (setq st-d (1+ st-d)) (progn (setq st-d 0)
(if (<= st-e 14) (setq st-e (1+ st-e)) (progn (setq st-e 0)
(if (<= st-f 14) (setq st-f (1+ st-f)) (setq st-a 0 st-b 0 st-c 0 st-d 0 st-e 0 st-f 0))))))))))))
); конец второго if
(apply 'strcat
(reverse (mapcar '(lambda (j)
(if (= j 0) (setq st "0") T)
(if (= j 1) (setq st "1") T)
(if (= j 2) (setq st "2") T)
(if (= j 3) (setq st "3") T)
(if (= j 4) (setq st "4") T)
(if (= j 5) (setq st "5") T)
(if (= j 6) (setq st "6") T)
(if (= j 7) (setq st "7") T)
(if (= j 8) (setq st "8") T)
(if (= j 9) (setq st "9") T)
(if (= j 10) (setq st "a") T)
(if (= j 11) (setq st "b") T)
(if (= j 12) (setq st "c") T)
(if (= j 13) (setq st "d") T)
(if (= j 14) (setq st "e") T)
(if (= j 15) (setq st "f"))
(setq st st)
); конец lambd-ы  
(list st-a st-b st-c st-d st-e st-f))); конец reverse и mapcar-a
); конец apply
); конец defun st-16
LordN
нужно пользоваться тегом code и таких траблов не будет.
andrey R
Всем модераторам было отправлено уведомление от Supermax через кнопку «Жалоба».
Э, на камбузе!
Что еще за фигня в тексте? Не могу смайлик убрать!

Уважаемый Супер!
Сделайте одолжение, формулируйте свои жалобы в ином тоне. По хорошему прошу, по доброму...
kpblc
Ребят, а смысл какой ковыряться с хендлами, скажите? Вы ж проходите целиком по файлу (причем вынуждены отлавливать ошибки преобразования), потом получать примитив, потом - его владельца, определять владельца, разворачивать свойства и методы, необходимые для дальнейшей обработки, при этом избегать дублирования... Не много ль будет? По-моему, вы идете не с той стороны.
Кстати, функции преобразования шестнадцатиричного числа в десятичное и обратно показывались на autocad.ru: http://www.autocad.ru/cgi-bin/f1/board.cgi?t=5624Ob например.
---
Добавлено: [offtop]Опа, какие тут страсти-то кипят, оказывается...[/offtop]
Supermax
Kpblc, посмотрел, ничего интересного. Во первых у меня это счетчик. Во вторых, строить счетчик на десятичном принципе, а потом переводить в шестнадцатиричное значение - лисп, километр длинной. В третьих, здесь я могу и строкой, и списком, и задом на перед и отдельными позициями через пробел, а при переводе - только как по науке. Негибко и громоздко.
Supermax
Kpblc, это ты ко мне во множественном числе? Нельзя столько за компьютером сидеть. Видишь, уже двоится в глазах. Про метки тобишь Handl-ы ты не догоняешь преследуемые цели. Тебе сразу мерещаться какие-то базы и сложные археологические раскопки. А мне интересен принцип определения номера метки. Там сплошные пробелы, как сито, но постоянно одни и теже начальные условия записи. Вот и анализирую. Щас списочек составлю, закономерность вычислю и обнародую.
Потом, возвращаемый vla-объект сразу проверяется на принадлежность (сам понимаешь к чему). И мне интересен ответ на следующий вопрос: Вот я nentsel-ом пробиваю все ссылки насквозь и получаю значении примитива - APP: имя и метку, которые меня устраивают, но эти данные уже были в описании базы рисунка, или созданы путем конвертации в момент моего воздействия на рисунок? Это очень важно знать, поскольку может и искать нечего, или искать надо не то, что я ищу.
kpblc
Ты не увидел главного:
Цитата
По-моему, вы идете не с той стороны.

Ладно, аллах с ним. Допустим (подчеркиваю - допустим!) ты получил все хендлы всех примитивов (и не только их - еще захватишь и словари, и стили, и прочую неграфическую информацию) своей функцией. Дальше что будешь делать? Ты, извиняюсь, едешь в из Питера Москву через Баку, захватывая Магадан и Калининград.
Для справки: получить указатели на все примитивы файла, включая подпримитивы блоков и внешних ссылок:
Код
(defun _kpblc-get-all-entitites-with-sub (/ res)
  (vl-load-com)
  (vlax-for blk_def
            (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
    (setq res (cons blk_def res))
    (vlax-for subent blk_def
      (setq res (cons subent res))
      );_ end of vlax-for
    );_ end of vlax-for
  res
  );_ end of defun

Ради интересу проверни на одном и том же файле свою функцию и мою. Разницу по спискам вычисли уж сам и покажи, какого типа у тебя объекты там остались. Я думаю, останется то, что особо-то не требуется. Я сознательно исключил из своей обработки текстовые, размерные стили, слои, наборы и т.п.
---
Добавлено: пока колошматил ответ, Supermax меня ухитрился опередить smile.gif
Цитата
Kpblc, это ты ко мне во множественном числе?

Там был еще пост от Litvinov'a, я к обоим и обращался wink.gif
Цитата
А мне интересен принцип определения номера метки. Там сплошные пробелы, как сито, но постоянно одни и теже начальные условия записи. Вот и анализирую. Щас списочек составлю, закономерность вычислю и обнародую.

Я когда разговаривал с Эдуардом (известен под никами Эдуард и Эдуард Смолянка), он мне сказал, что закон формирования хендлов достаточно сложная штука. Например, при описании блока на него (то бишь описание) количество и закономерность распределения хендлов закону поддается, но, как бы это сказать... В общем, своему закону. Простому смертному его не понять.
---
Добавлено 2:
Если честно, то DXF нужен в нескольких строго определенных случаях - например, работать с ENDBLOCK. А получать доступ в ENDBLOCK надо только если приходится модифицировать там 8 группу. Этот баг требовалось фиксить руками только в 2002 версии, начиная с 2005 он уже на уровне ядра решен, насколько я знаю (по крайней мере при работе по созданию блоков через vla вопросов не возникало). Если же DXF 8 в ENDBLOCK не "0", то это вина того программера, который так писал софт создания блоков.
Supermax
Ну наконец-то! А тоя уже грешил, думал не хорошее. Щас подломаю чуть-чуть, и в дело воткну. Результаты варварского отношения к чужим функциям показывать?
Supermax
Спасибо тебе kpblc, огромное, но не катит. Да, и не все блоки и внешние ссылки выбрало, да и не из того источника. Мне имена вхождений нужны, а не базовые свойства. В частности в список почему-то не попала самая верхняя ссылка. Та, которую можно пошевелить мышкой на экране. Может плохо смотрел? Но я фильтровал список ...? Щас еще покапаюсь.
Так, нашлась в ModelSpace.
Еще прикол: (entget (nth 0 (nth 0 (reverse (setq rezultat (nentsel "Укажи блок:")))))) метки, полученные вот так, к прмеру (5 . “10094”) не работают ни так (vla-HandleToObject (vla-get-ActiveDocument (vlax-get-acad-object)) "10094")
ни так (handent "10094"). DXF код 5 видим, а от куда он такой не понятно.
kpblc
Цитата
Да, и не все блоки и внешние ссылки выбрало, да и не из того источника

Мой код проходит целиком по файлу, ему на все плевать. Специально сделал излишнюю информативность, как ты любишь.
Цитата
Мне имена вхождений нужны, а не базовые свойства.

А я тебе что предоставляю :?: Именно указатели на примитивы, а что ты там с ними делаешь - это уже твоя епархия.
Цитата
В частности в список почему-то не попала самая верхняя ссылка. Та, которую можно пошевелить мышкой на экране. Может плохо смотрел?
Скорее всего, поскольку она там быть должна. Вводи фильтрацию результата, удаляй "не внешние ссылки" и теде. Чего отказался от очевидного пути - я не понимаю.
Цитата
Так, нашлась в ModelSpace.

Ессно, а где ж ей еще быть-то?
Цитата
DXF код 5 видим, а от куда он такой не понятно.

Потому что этот DXF на самом деле принадлежит пространству ссылки, а не текущего документа. vla-handletoobject и handent работают с пространством хендлов только текущего документа, насколько я знаю. Хендлы могут быть незаменимы в других случаях, и, к сожалению (счастью?) подсчет примитивов для спецификации точно в эти случаи не входит.
Supermax
Ну ладно, будем подходить к вопросу с формальной стороны.
Между этим выражением (твой лисп):
Код
(vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))

и этим (моя ну, скажем временная переделка):
Код
(vla-get-ModelSpace (vla-get-activedocument (vlax-get-acad-object)))

есть разница и утверждать, что твой лисп дает все элементы - наглая ... неточность.
Элементы "верхних" ссылок лежат именно в ней. А в коллекции "blocks" их нет и не может быть. Как не попадут туда и другие элементы, лежащие прямо в модели.
Элементы коллекции "Layouts" можно найти только в этой коллекции. И вообще коллекций не 3 и не 4, а больше. В каждй лежат принадлежащие ей объекты.
Ну, это, сам понимаешь, не для тебя. Ты любишь публику развлекать и натаскивать, так я тебе подигрываю.

То, что эта метка не от объекта (потому и не работают с ней функции, которые по метке находят указатели на объект) я понял еще вчера по дороге домой. Лежат они в словаре "ACAD_XDICTIONARY" в коде 360 на него дан указатель. Щас я его буду потрошить.
И добавлю, поэтому и не меняются от одного открытия файла к другому. Вот только что открыл, а метка попрежнему "10094".
Supermax
К стати, чтобы пройти по ModelSpace, вторую половину твоего лиспа надо заблокировать. Погружаться в подпримитивы в этой коллекции немоги.
Хочу еще немного добавить. Знаешь, включение ручек у элементов, скажем, чтобы не путаться с коллекциями, чертежа - вещь сама по себе очень нужная, и не только для специфицирования. Даже если с этими элементами вручную ничего сделать нельзя, свойства им менять можно. Проверено. _refedit полезна еще и тем, что по желанию пользователя может не сохранять внесенные изменения в ссылку, а может и сохранить. Например вентиляционщики прорубили в стене, которую наваял архитектор, дыру, и эта дыра должна попасть на чертежи всех остальных групп проектировщиков. Ссылка должна подгружаться не с компа архитектора, а с сервера. Вдруг архитектор заболеет и не выйдет на работу? Кто его комп без него включет? Все сразу увидят реакцию.
Так, что битва продолжается. Даещь включенные ручки!
kpblc
Гидрит твою перекись...
Запускай лисп:
Код
(defun test (/ line_model line_paper)
  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    );_ end of vla-StartUndoMark
  (setq line_model
                   (vla-addline
                     (vla-get-modelspace adoc)
                     (vlax-3d-point '(0. 0. 0.))
                     (vlax-3d-point '(100. 100. 100.))
                     );_ end of vla-addline
        line_paper (vla-addline
                     (vla-get-paperspace adoc)
                     (vlax-3d-point '(0. 0. 0.))
                     (vlax-3d-point '(100. 0. 0.))
                     );_ end of vla-addline
        );_ end of setq
  (vla-endundomark adoc)
  (princ)
  );_ end of defun

Теперь пройдись по файлу твоим и моим лиспом.
Твой вариант (как я предполагаю):
Код
(defun try01 (/ res)
  (vlax-for ent
            (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
    (setq res (cons ent res))
    );_ end of vlax-for
  res
  );_ end of defun

Вернет нечто типа
Код
_$ (try01)
(#<VLA-OBJECT IAcadLine 0ea3df14>)

Мой вариант:
Код
_$ (_kpblc-get-all-entitites-with-sub)
(#<VLA-OBJECT IAcadLine 0ea3ddd4> #<VLA-OBJECT IAcadPaperSpace3 0ea3deb4> #<VLA-OBJECT IAcadLine 0ea3df14> #<VLA-OBJECT IAcadModelSpace3 0e9c0fa4>)
Ты хотел излишней информативности? Ты ее получил. И теперь еще и недоволен.
Теперь в тот же файл вставляем в пространство модели внешней ссылкой source2.dwg, в котором в свою очередь внешней ссылкой вставлен source1.dwg.
Твой (все еще в моем предположении, ты ж код не показываешь):
Код
_$ (try01)
(#<VLA-OBJECT IAcadExternalReference2 0ea33164> #<VLA-OBJECT IAcadLine 0ea3df14>)

Мой: посмотришь сам. Для справки:
Код
_$ (LENGTH (try01))
2
_$ (LENGTH (_kpblc-get-all-entitites-with-sub))
4328

Файлы прилагаются.
---
Добавлено: Если внешнюю ссылку вставить в пространство листа, твой (предполжительно) вариант ее не учтет.
kpblc
Цитата(Supermax @ 27.6.2007, 11:05) *
К стати, чтобы пройти по ModelSpace, вторую половину твоего лиспа надо заблокировать. Погружаться в подпримитивы в этой коллекции немоги.
Хочу еще немного добавить. Знаешь, включение ручек у элементов, скажем, чтобы не путаться с коллекциями, чертежа - вещь сама по себе очень нужная, и не только для специфицирования. Даже если с этими элементами вручную ничего сделать нельзя, свойства им менять можно. Проверено. _refedit полезна еще и тем, что по желанию пользователя может не сохранять внесенные изменения в ссылку, а может и сохранить. Например вентиляционщики прорубили в стене, которую наваял архитектор, дыру, и эта дыра должна попасть на чертежи всех остальных групп проектировщиков. Ссылка должна подгружаться не с компа архитектора, а с сервера. Вдруг архитектор заболеет и не выйдет на работу? Кто его комп без него включет? Все сразу увидят реакцию.
Так, что битва продолжается. Даещь включенные ручки!

Я тебе лиспом без влюченных ручек для любого примитива все что угодно (ну или почти все) сделаю. В том числе и цвет / тип линии / вес линии / слой поменяю. Дашь мне указатель на него - и пжалста. Ручки - инденрнах, как поет Rammstain.
Внешние ссылки подобным образом обновлять я не буду из принципа. Надо поменять - нехай пользователь входит в редактирование ссылки и по новой запускает команду / функцию. Но ответственность за это должен нести он, а не я.
---
Добавлено:
Если тебя устроит ручная регистрация dll, то могу попробовать собрать кусок для подсчета примитивов, включая внешние ссылки. Результат выводится в многострочный текст.
Supermax
Та, доволен я, доволен. А информативность тут совсем не причем. Ну нарисовал ты пару линий, одну в модели, другую в layout-е ну и что? Твой макрос правильный, выгребает элементы по всему файлу, но только пренадлежащие к конкретной коллекции, которую надо сменять вручную. Ну и что? Да не напрягайся ты, новый макрос на эту тему строчить. Надо искать источник информации "10094". Отвлекаемся.
Supermax
Погоди малость. От твоего предложения (но только от его кусочка)
Цитата
могу попробовать собрать кусок для подсчета примитивов, включая внешние ссылки

я, упаси меня бог, не откажусь. И даже выводить никуда не надо. Так, сегмент общего целого. Только сейчас у меня охотничий азарт бушует и я не могу адекватно реагировать на происходящие события.
Как это так, я nentsel-ом могу ручку включить, а программно нет? Я не лох, чтобы на такие вещи не обращать внимания. Коль в этом угле все в паутине, значит сюда мало народу ходит, а значит может быть что-нибудь припрятано (детский инстинкт).
kpblc
Теперь часть дцатая.
Загружаешь лисп:
Код
(defun test2 (/ adoc blk pline vert pt)
  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    );_ end of vla-StartUndoMark
  (if (not (tblobjname "blocks" "myblock"))
    (progn
      (setq
        blk   (vla-add (vla-get-blocks adoc)
                       (vlax-3d-point '(0. 0. 0.))
                       "myblock"
                       );_ end of vla-add
        vert  '(-10. -10. -10. 10. 10. 10. 10. -10.)
        pline (vla-addlightweightpolyline
                blk
                (vlax-make-variant
                  (vlax-safearray-fill
                    (vlax-make-safearray
                      vlax-vbdouble
                      (cons 0
                            (1- (length vert))
                            );_ end of vlax-make-safearray
                      );_ end of vlax-make-safearray
                    vert
                    );_ end of vlax-safearray-fill
                  );_ end of vlax-make-variant
                );_ end of vla-addlightweightpolyline
        );_ end of setq
      (foreach prop (list '("color" . 0)
                          '("layer" . "0")
                          (cons "lineweight" aclnwtbyblock)
                          (cons "linetype" "byblock")
                          (cons "closed" :vlax-true)
                          (cons "normal" (vlax-3d-point '(0. 0. 1.)))
                          );_ end of list
        (vl-catch-all-apply
          '(lambda () (vlax-put-property pline (car prop) (cdr prop)))
          );_ end of VL-CATCH-ALL-APPLY
        );_ end of foreach
      );_ end of progn
    (setq blk (vla-item (vla-get-blocks adoc) "myblock"))
    );_ end of if
  (while
    (and (not (vl-catch-all-error-p
                (vl-catch-all-apply
                  '(lambda ()
                     (setq pt (getpoint "\nУкажи точку вставки <Отмена> : "))
                     );_ end of LAMBDA
                  );_ end of VL-CATCH-ALL-APPLY
                );_ end of VL-CATCH-ALL-ERROR-P
              );_ end of not
         pt
         );_ end of and
     (vla-insertblock
       (if (and (zerop (vla-get-activespace adoc))
                (= :vlax-false (vla-get-mspace adoc))
                );_ end of and
         (vla-get-paperspace adoc)
         (vla-get-modelspace adoc)
         );_ end of if
       (vlax-3d-point pt)
       "myblock"
       1.
       1.
       1.
       0.
       );_ end of vla-InsertBlock
     );_ end of while
  (vla-endundomark adoc)
  (princ)
  );_ end of defun

И выполняешь его на чистом файле сначала в модели, потом в листе1, потом в листе 2. В каждом пространстве раза по 2-3 будет достаточно. Сравни результаты своего и моего кодов. И наконец выложи свой вариант.
Supermax
А, я понял, это ты пытаешся меня отвлечь и сбить с верного пути?
Прекрати строчить функции! У меня их ковырять не то состояние. Говорю же ясно - напал на след, ушел в нирвану, вернусь, как только наступит облом или полное просветление. Тебе разве не хочется уметь ручки включать? Ну и что, что ты можешь в базовых свойсвах хипиш навести? Лучше попробуй откорректированную вставку внешней ссылки прописать новым файлом и таким образом закрепить изменение в этой конкретной вставке. Загляни в свой ящик на этом форуме.
kpblc
Цитата
А, я понял, это ты пытаешся меня отвлечь и сбить с верного пути?

Наоборот вообще-то...
Цитата
Прекрати строчить функции! У меня их ковырять не то состояние.
А я не прошу их "ковырять". Я прошу их запустить и показать результат.
Цитата
Тебе разве не хочется уметь ручки включать?

Не-а, не хочется. Зачем?
Цитата
Лучше попробуй откорректированную вставку внешней ссылки прописать новым файлом и таким образом закрепить изменение в этой конкретной вставке.

И не подумаю. О причинах см. выше.
Прочитать данные - да, запросто. Менять и сохранять? Нет. Я уж лучше тогда в пользовательские свойства файла или в словари полезу и в них буду ковыряться. И то не факт.
Ха! Кстати, один момент!
Смотри, пользователь №1 открывает файл с внешней ссылкой src.dwg. Пользователь №2 - Открывает просто файл src.dwg. №2 получает полный доступ к файлу и блокирует его. В это время пользователь №1 (по твоей логике) пытается чего-то там поменять и сохранить. Он получает ошибку, а ты - головняк. Я такое отследить точно не смогу. Да и не захочу smile.gif
Supermax
Тогда я сейчас поднапрягусь и легко стану круче тебя.
По поводу конфликтов открытия - не все так пасмурно, как ты рисуешь. Пользователь подгрузил файл внешней ссылки, разве он его открыл? - нет. Кто-то открыл этот файл и курочит. В это время пользователь хочет сохранить свои данные, что происходит? - правильно комп отвечает, что документ уже открыт и занят другим приложением. Машине по барабану пользователи, она приложениями оперирует. Она может тебе открыть еще раз этот файл, или подгрузить как внешнюю ссылку, но только для чтения. Вообще, процесс подгрузки файла как ссылки - чистой воды его читание. Извини за коверканье русского языка. Изменить этот файл машина сможет только после того, как его освободят. Операционные системы эти перехлесты давным давно обрабатывают и не допускают сбоев. А в Лиспе куча функций для этого сделана. И проверка на занятость, и на доступ и т.п. Я вообще-то не из детского сада. Лет так 15 назад писал на Assembler-е и сам прошивал ПЗУ. Разрабатывал спецпроцессоры и имею два авторских свидетельства. Так что ЭТИ напряги и не напряги вовсе, а так, разминка затекших суставов головного мозга.
Supermax
Да, ты был прав, помимо того, что ссылка из корня есть в ModelSpace, она есть и в Blocks.
Только вот незадача. Она #<VLA-OBJECT IAcadExternalReference2 05ed4354>) а проверка на вшивость,
Код
(= (vla-get-IsXRef blk_def) :vlax-true)

выдает, что не внешняя ссылка.

Код

(defun _kpblc-get-all-entitites-with-sub ( / )
(vl-load-com)
(setq res nil)
(vlax-for blk_def
(vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
(if (and
(= (vlax-get-property blk_def 'ObjectName) "AcDbBlockReference")
;(= (vla-get-IsXRef blk_def) :vlax-true)
)
(setq res (cons blk_def res)))
(vlax-for subent blk_def
(if (and
(= (vlax-get-property subent 'ObjectName) "AcDbBlockReference")
;(= (vla-get-IsXref blk_def) :vlax-true)
) (setq res (cons subent res)))
);_ end of vlax-for
);_ end of vlax-for
;res
);_ end of defun


Как такое может быть?
Я специально забил эту проверку, чтобы проверить этот факт.
kpblc
Цитата
Тогда я сейчас поднапрягусь и легко стану круче тебя.

Да чтоб я спорил!
Цитата
В это время пользователь хочет сохранить свои данные, что происходит? - правильно комп отвечает, что документ уже открыт и занят другим приложением.

Ага. А функция-то твоя не сработала. Какие будут действия?
Флаг занятости файла лиспом просто так не прочитать, я уже проходил через это - надо использовать либо танцы с бубном, либо vl-расширение.
Цитата
Я вообще-то не из детского сада. Лет так 15 назад писал на Assembler-е и сам прошивал ПЗУ. Разрабатывал спецпроцессоры и имею два авторских свидетельства. Так что ЭТИ напряги и не напряги вовсе, а так, разминка затекших суставов головного мозга.

И?
Supermax
Лисп файл не занимает. Файл занимает приложение, тобиш программа AutoCAD (в нашем случае). При чтении файла с винчестера, операционная система не разрешает его редактировать. Никогда. Прочесть файл можно, и записать прочитанное в свободную область памяти. Там эту запись куроч, как душе угодно. А когда прийдет черед записать (точнее заменить старую запись файла на новую) - если файл не открыт другим приложением, то пожалуйста. Если открыт, то в очередь. Архитектор вносит свои зменения, сохраняет их на сервере, ты их отправляешь сразу как только он закроет файл в корзину и вместо этого файла вставляешь старую версию, но со своими изменениями. Никаких конфликтов не вижу. Это примерно одно и тоже, что два пользователя на одном компьютере.
Supermax
Успел, не успел, не знаю. Продолжу.
Даже такую, чисто административную задачу можно легко решить автоматически.
Любой файл имеет признаки, по которым можно определить, менялся он за прошедшее время или нет. Дата и время поледнего изменения, контрольная сумма и пр. При открытии файла с внешними ссылками, эти признаки надо слизать (если только они уже не слизаны и лежат где-нибудь в словаре) и при сохранении своих изменений с начала надо бы проверить, а не изменился ли файл. Если изменился, то вот тут и надо программно сделать следующее: Во первых надо как-то записать что прибавилось к этому документу, и что изьято. То, что прибавилось - прибавить, а то, что изьято (например, кусок стены) проверить на наличе и изъять. Если интересно продолжим, а если нет, то +.
Supermax
Так, новые приколы.
Твой лисп с моим фильтром:
Код
(defun _kpblc-get-all-entitites-with-sub ( / )
(vl-load-com)
(setq res nil)
(vlax-for blk_def
(vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
(if (and
(= (vlax-get-property blk_def 'ObjectName) "AcDbBlockReference")
(= (vla-get-Name blk_def) "2-е вложение")
)
(setq res (cons blk_def res)))
(vlax-for subent blk_def
(if (and
(= (vlax-get-property subent 'ObjectName) "AcDbBlockReference")
(= (vla-get-name subent) "2-е вложение")
) (setq res (cons subent res)))
);_ end of vlax-for
);_ end of vlax-for
res
);_ end of defun


Справка:
"2-е вложение" - это объект внешней ссылки, тот, который не хочет проходить проверку на принадлежность к ссылкам. Лежит прямо в корне модели и его можно "пошевелить" мышкой. "Корневой" короче.

Запускаем: (_KPBLC-GET-ALL-ENTITITES-WITH-SUB)
Получаем: (#<VLA-OBJECT IAcadExternalReference2 05ed4354>)

Ну она у меня всего одна, как и у тебя.

Запомнили.
Теперь получаем этот же объект через vla-Item
Код
(setq obj (vla-Item (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object)))
(vla-get-Name (vlax-ename->vla-object (car (entsel))))))


Справка:
(vla-get-Name (vlax-ename->vla-object (car (entsel)))) - возвращает "2-е вложение"

А код возвращает:
#<VLA-OBJECT IAcadBlock3 061af734>
Сравниваем:
#<VLA-OBJECT IAcadExternalReference2 05ed4354>
и офигиваем.

Как из одного и того же источника, в частности (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object)))
можно получить два разных объекта одного и того же?
Supermax
Так, в коллекции Blocks два элемента с таким именем один AcDbBlockTableRecord, который и находит моя (а точнее Полищука) прибамбасина, а у тебя я с начала фильтрую на предмет AcDbBlockReference.
Разобрался, но не до конца. Почему Item нашла именно таблицу, а не блок?
А, разобрался, потому, что AcDbBlockReference не поддерживает метод Item.
mmax
Цитата(Supermax @ 27.6.2007, 12:49) *
Теперь получаем этот же объект через vla-Item
Код
(setq obj (vla-Item (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object)))
(vla-get-Name (vlax-ename->vla-object (car (entsel))))))


Справка:
(vla-get-Name (vlax-ename->vla-object (car (entsel)))) - возвращает "2-е вложение"

А код возвращает:
#<VLA-OBJECT IAcadBlock3 061af734>
Сравниваем:
#<VLA-OBJECT IAcadExternalReference2 05ed4354>
и офигиваем.

Как из одного и того же источника, в частности (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object)))
можно получить два разных объекта одного и того же?

Этоже объэктная модель. MODEL(PAPER)SPACE и BLOKS это совершенно разные вещи потому и объекты разные.

Досихпор копаетесь в заднице, проктологи.
Сыылка есть другой документ и пользователь может спокойно его открыть и поковырять. Зчем же вам все через выхлопную трубу делать?
Supermax
Ну, поживешь еще малость, геморрой заработаешь, так будешь проктологам кланяться и бабки платить, чтобы помогли значит.
Не делать всегда проще, чем делать. А когда сделано, обычно говорят "а, фигня, чего столько было шуметь?".
А объекты, внимательный ты наш, взяты из одного и того же источника. Через строчку читаете товарищи! Только их два, один - таблица, другой - внешняя ссылка. Один Item поддерживает (таблица), Другой - нет (ссылка). Вот и весь базар.
Ссылку можно открыть и отдельно, только вот все, как бы это сказать, окружающие эту ссылку в файле общей сборки модели детали видны не будут и корректировать, например делать в стене дыру, не видя воздуховод, будет мягко говоря - затруднительно. Создавать кучу моделей, где ссылками указаны другие работы кроме твоей, а у соседа своя модель, где уже ты ссылка, я думаю можно не продолжать? Комплексная модель - это один файл для всех. Как сборочный чертеж. Верхушка пирамиды так сказать. А вот редактировать внешнюю ссылку открыванием ее файла - и есть, через одно место.
Тут такая ситуация может (а скорее всего абязательно будет) возникнуть, что в этой модели, откорректировав ссылку, ее надо будет сохранять отдельным файлом и это уже будет не копия ссылки типового этажа, а типовой этаж с изменениями, необходимыми, скажем для оборудования теплопункта или венткамеры, или еще чего нибудь.
mmax
В объектной модели сидит такая шишка
есть объект BLOKS он является контейлером для объектов BLOCK. В BLOCK можно добавлять графические объекты(линии окружности итп) в BLOKS нельзя. при этом BLOCK это есть то самое что мы вставляем командой INSERT после чего в модели получается объект блокреференс. Тоесть BLOCK это еще есть неграфический примитив, если графическими считать только то что можно видеть на экране.

А уж Model(paper)space содержать такие примитивы как BLOKS и BLOCK просто не может в ней могут быть только референсы на объект BLOCK, тоесть только те которые мы видим на экране. Эитим и объясняется тот факт что вы ищете в семействах блоков референсы а находите таблицы, или описания.

Вот и вся мазута про объектную модель.

При этом добавлю еще что BLOKS и Model(paper)space являются объектами документца который в свою очередь является объектом аппликашиона.

А если вас заставляют работать по "нашему" и пользовать только ссылки стронних разработчиков, то всегда можно послать всех на. И работать по своему.
kpblc
Только что добрался до железки, так что по пунктам и постам smile.gif
Цитата
Лисп файл не занимает. Файл занимает приложение, тобиш программа AutoCAD (в нашем случае). При чтении файла с винчестера, операционная система не разрешает его редактировать. Никогда. Прочесть файл можно, и записать прочитанное в свободную область памяти. Там эту запись куроч, как душе угодно. А когда прийдет черед записать (точнее заменить старую запись файла на новую) - если файл не открыт другим приложением, то пожалуйста. Если открыт, то в очередь. Архитектор вносит свои зменения, сохраняет их на сервере, ты их отправляешь сразу как только он закроет файл в корзину и вместо этого файла вставляешь старую версию, но со своими изменениями. Никаких конфликтов не вижу. Это примерно одно и тоже, что два пользователя на одном компьютере.

Я это знаю. Проблема в том, что для чтения файла (не текстового, а dwg) (добавлено: естественно, я говорю про файл, открытый другой сессией AutoCAD'a) надо поизвращаться. Хотя бы потому, что простой (open file "r") или vla-open без указания последнего флага вернет ошибку; ObjectDBX вернет ошибку независимо ни от чего. И через это я проходил. И, кстати, как ты собираешься отслеживать очередь сохранения изменений? Vault писать "на коленках" лично я не согласный.
> #140 :
Ты путаешь описания блока и его вхождения. Со всеми вытекающими wink.gif
> #142: mmax, я согласен быть проктологом-иллюзионистом. Только очень недолго.
> #143: Это вопрос схемы совместной работы через внешние ссылки, на dwg.ru как-то обсуждался. В принципе есть 2 схемы - "Кольцо" и "Звезда". Лично я больше склоняюсь к "звездочной" схеме (в силу различных причин, и не последняя - это система работы ADT). Хотя и кольцевая более чем имеет смысл. Я пока писал ответ, разыскал ссылку http://dwg.ru/forum/viewtopic.php?t=630&start=10000 - думаю, будет небезынтересно.
---
Добавлено: Во, чего обещал (придумывать дальше пока что лениво). Берите, тестируйте. Вызывать как (_kpblc-count-and-report). Перед вызовом вручную зарегистрировать dll (там ненужного полно, мне вычищать там будет слишком долго). О багах прошу сообщать.
Если что - пишите в личку, по мере возможности буду доделывать.
---
Добавлено 2: P.S. При работе с неоткрытыми файлами их внешние ссылки не обрабатываются. По крайней мере пока.
---
Добавлено 3: После некоторого тестирования, нашел небольшую ошибку в формировании текста ("имя компьютера" показывалось "не то"). Исключил. Во вложении - исправленный вариант.
---
Добавлено 4: обнаружено еще 1 мелкая ошибка и забытая функция. Исправлено, приаттачено.
---
Добавлено 5: добавил readme.txt, объясняющий, как зарегистрировать (и при необходимости разрегистрировать) dll.
Supermax
ВСЕ! Включаются ручки!
УРА-А-А!!!

Вчера в половине одинадцатого, наконец-то включил. До конца еще не успел все отлизать. Сейчас этим займусь.

Kpblc, твой ник увековечиваю в функции с применением vlax-for какое бы нутро в ней не было.
mmax, тебя тоже не забуду, в тексте себя найдешь. Общение, и даже некоторая порция адреналина у меня в крови сделали свое "черное" дело. Благодарю!
Все, абсолютно все, подробно распишу и сюда выложу.
Я до сих пор работал только с наборами, создаваемыми из пространства модели, теперь я могу и в базе рыться.
kpblc
Спасибо, конечно smile.gif
Supermax
И так, продвинаемся дальше.
В присоединенном файле .rar следующие файлы:
Вложение1.dwg - 2-я от верха глубина
Вложение2.dwg - 1-я от верха глубина
Вложение3.dwg - тот файл, который надо открывать.
Фильтр ФМФ Водоприбор Ду 65.dwg - простой файл с блоком (самый низкий уровень вложенности)
Окно.bmp - вид дерева вложений, которое должно быть и у вас. (И у тебя, kpblc, в частности)
Книга1.xls - сранение свойсв внешних ссылок: "Корневой" - "Вложение2" и "погруженной" в ее нутро "Вложение1"
Вложение3.dwg - тот файл, который надо открывать.

Еще раз повторюсь - смотрите Окно.bmp

1. Сраниваем объекты, полученные из ModelSpace и Blocks, на предмет возможности их открытия _-refedit.

- Получение "корневой" ссылки с именем "Вложение2" из ModelSpace:
Код
(defun _kpblc-get-all-AcDbBlockReference-with-ModelSpace ( / )
(vl-load-com)
(setq res3 nil)
(vlax-for blk_def
(vla-get-ModelSpace (vla-get-activedocument (vlax-get-acad-object)))
(if (and
(= (vlax-get-property blk_def 'ObjectName) "AcDbBlockReference")
)
(setq res3 (cons blk_def res3)))
);_ end of vlax-for
);_ end of defun. В переменной res3 - результат в виде списка vla-объектов


Оговорюсь, поскольку у нас в "корне" только один объект -"Вложение2", то это оно и есть. Можно было и не делать проверку на "AcDbBlockReference", все равно один только объект лежит на столе, но это так, перекочевало из предидущей версии.

Запускаем функцию - (_kpblc-get-all-AcDbBlockReference-with-ModelSpace)
Создаем пустой набор ss1 - (setq ss1 (ssadd)); или этим же самым обнуляем существующий
Добавляем в набор первый элемент из списка res3 - (ssadd (vlax-vla-object->ename (car res3)) ss1)
Включаем ручку - (sssetfirst nil ss1)
Запускаем -refedit - (command "_-refedit" "O" "A" "N")
Смотрим на экран и убеждаемся, что мы "тама". Появится панель "Refedit".
Нажимаем на ней значек выхода и сваливаем.

Далее: Находим тоже самое в коллекции Blocks
Код
(defun _kpblc-get-all-AcDbBlockReference-with-blocks ( / )
(vl-load-com)
(setq res nil)
(vlax-for blk_def
(vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
(if (and
(= (vlax-get-property blk_def 'ObjectName) "AcDbBlockReference")
(= (vla-get-Name blk_def) "Вложение2")
)
(setq res (cons blk_def res)))
(vlax-for subent blk_def
(if (and
(= (vlax-get-property subent 'ObjectName) "AcDbBlockReference")
(= (vla-get-name subent) "Вложение2")
) (setq res (cons subent res)))
);_ end of vlax-for
);_ end of vlax-for
res
);_ end of defun; в переменной res в виде списка одно единственное значение, удовлетворяющее обеим требованиям.


Фильтр настроен на "Вложение2" в последующем надо будет 2 исправить на 1. см. далее.

Повторяем цикл запуска refedit:
Запускаем функцию - (_kpblc-get-all-AcDbBlockReference-with-blocks)
Создаем пустой набор ss1 - (setq ss1 (ssadd)); или этим же самым обнуляем существующий
Добавляем в набор первый элемент из списка res3 - (ssadd (vlax-vla-object->ename (car res3)) ss1)
Включаем ручку - (sssetfirst nil ss1)
Запускаем -refedit - (command "_-refedit" "O" "A" "N")
Смотрим на экран и убеждаемся, что мы "тама". Появится панель "Refedit".
Нажимаем на ней значек выхода и сваливаем.

Выводы:
И из Blocks, и из ModelSpace "корневые" ссылки прекрасно запускаются refedit.
Правда есть одна "козявочка" свойство, которого на самом деле нет, (см. dump) - IsXRef, эти "корневые" ссылки в упор не видит. Системная переменная "REFEDITNAME" если ее читать при ручном запуске _-refedit - показывает имя ссылки, которое сейчас будет редактироваться. Ну вместо того, чтобы отвечать на запросы типа Да/Нет ввести в строку запроса лисп выражение (getvar "REFEDITNAME") и в свойство InsUnits (RO) = "Millimeters"

Все остальные ссылки - ручки включаются, Переменная "REFEDITNAME" показывает при ручном запуске _-refedit - пустую строку "", свойство InsUnits (RO) = "Unitless" Но, проверка на значение свойства IsXRef - показывает, что объект является внешней ссылкой. У меня есть сильное подозрение, что это не проверка на свойство, а проверка на принадлежность к ссылке или блоку. Надо будет попробовать на простом примитиве.
Да, и самое главное, Refedit запускается, проходит все стадии диалога и выкидывает *Сancel*. Если запускать без дефиса, ссылка появляется в окне диалога, но дальше этого диалога процесс не катит.
Системная переменная "XEDIT" всегда в 1.

В файле Excel сравнены свойства двух ссылок "Вложение1" (первый столбец) и "Вложение2"

У кого есть какие идеи?
kpblc
Во-первых, приятного.
Во-вторых, когда появишься, попробуй мои последние варианты. Вдруг покатят?
---
Добавлено: запускаю (_kpblc-count-and-report), в многострочнике получаю:
Цитата
Код
Подсчет элементов
Формирование отчета начато 28.06.2007 в 12:52:32 и окончено в 28.06.2007 в 12:52:38
Файл на момент подсчета не сохранен
В формировании отчета используются следующие настройки:
    Выбор:
        выполняется пользователем. Результат умножен на 1
Внешние ссылки  учитываются
Состав блоков копирования-вставки  не  учитывается
    Домен компьютера: <...>
    Логин пользователя: <...>
***

Учитываются элементы : блоки; дин.блоки; тексты;
***

Отчет в файл не экспортировался
***
Наименование : Фильтр ФМФ Водоприбор Ду 65    Кол.: 2

P.S. Кстати, в своем Excel'ном файлике ты пропустил еще и разницу по следующим свойства: Document; Handle; Hyperlinks; InsertionPoint; InsUntis; Name (ну, это понятно); ObjectID; OwnerID; Path; TrueColor. Хотя на фига оно надо, я не очень понимаю.
Supermax
Так, с "REFEDITNAME" все ясно, она всегда показывает пустую строку, аж пока не ответил на последний вопрос и не нажал самую большую кнопень. И только войдя в ссылку, уже появляется в ней имя.
Теперь с Units-ами разбираюсь.

Я разницу, там где она очевидно должна быть, типа имена и координаты вставки не считаю разницей. А вот единица измерения - другое дело. Когда файл создавался, в нем все было в миллиметрах, а тут перескочило. Подозрительно однако.
Supermax
** _kpblc-comserver-countoptions ERROR #93: bad argument type: VLA-OBJECT nil
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2025 IPS, Inc.