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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Получение объекта блока по объекту вставки

Получение объекта блока по объекту вставки

Ответ
Поиск в этой теме
Непрочитано 21.11.2016, 15:33 #1
Получение объекта блока по объекту вставки
AY
 
webcad.pro
 
Московская обл.
Регистрация: 06.01.2005
Сообщений: 501

Прошу помощи знатоков.

Суть проблемы такова:

Для получения доступа к описанию блока (block definition) через объект вставки (AcadBlockReference) использую приблизительно такой код:

Код:
[Выделить все]
 (setq doc (vla-get-activedocument (vlax-get-acad-object)))
(setq ent (car (entsel "\nSelect Block Ref: ")))
(setq obj (vlax-ename->vla-object ent))

(setq blk (vla-item (vla-get-blocks doc) (vla-get-EffectiveName obj)))
Однако на некотором этапе вылезла проблема с блоками на басурманском языке (как мне кажется) - имя блока полученное функцией (vla-get-EffectiveName obj) или (vla-get-Name obj) не желает искаться в коллекции блоков (vla-item (vla-get-blocks doc) ...). Выскакивает ошибка ; error: Automation Error. Key not found

Таким образом вопрос: как получить объект описания блока имея объект вставки? Либо как иначе обойти проблему иным путем?
Просмотров: 2646
 
Непрочитано 21.11.2016, 15:37
#2
Кулик Алексей aka kpblc
Moderator

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


Образчик предоставь.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 21.11.2016, 15:41
#3
AY

webcad.pro
 
Регистрация: 06.01.2005
Московская обл.
Сообщений: 501


dwg с блоком?
AY вне форума  
 
Непрочитано 21.11.2016, 15:42
#4
trir


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


анонимные, динамические блоки и аннотации, таблицы...
даже Модель и Листы - являются блоками

Цитата:
dwg с блоком?
да
trir вне форума  
 
Автор темы   Непрочитано 21.11.2016, 15:48
#5
AY

webcad.pro
 
Регистрация: 06.01.2005
Московская обл.
Сообщений: 501


Цитата:
Сообщение от trir Посмотреть сообщение
анонимные, динамические блоки и аннотации, таблицы...
даже Модель и Листы - являются блоками
Я в курсе коллега :)

Образец в приложении!
Вложения
Тип файла: dwg
DWG 2013
test.dwg (31.3 Кб, 17 просмотров)
AY вне форума  
 
Непрочитано 21.11.2016, 16:13
#6
trir


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


сравниваешь строки с разной кодировкой
https://forums.autodesk.com/t5/visua...e/td-p/4312065
trir вне форума  
 
Непрочитано 21.11.2016, 16:39
#7
Кулик Алексей aka kpblc
Moderator

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


Теоретически можно через ename-представления добраться до нормального описания, но это настолько муторно!..
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 21.11.2016, 16:51
#8
AY

webcad.pro
 
Регистрация: 06.01.2005
Московская обл.
Сообщений: 501


Цитата:
Сообщение от trir Посмотреть сообщение
сравниваешь строки с разной кодировкой
https://forums.autodesk.com/t5/visua...e/td-p/4312065
Погодите, но задача собственно не сравнить, а достать имя из вставки и передать его правильным образом в функцицю поиска. Как тут быть, если обычные средства автолиспа с этим не работатют? Или уже работают?

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Теоретически можно через ename-представления добраться до нормального описания, но это настолько муторно!..
Там я смотрел - единственная ссылка - код 330, но это ссылка на модель/лейаут.
AY вне форума  
 
Непрочитано 21.11.2016, 17:02
#9
trir


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


Ты используешь AutoLisp и COM - в первом у тебя только ANSI строки, во втором UTF или типа того. Символа Ö в ANSI нет, можно попробовать передать его как U+00D6 - может сработает
trir вне форума  
 
Непрочитано 21.11.2016, 17:19
#10
Кулик Алексей aka kpblc
Moderator

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


AY, ты не путай ename для вхождений и ename для описаний. В твоем конкретном случае ситуация показалась мне достаточно запутанной, а времени разбираться нет. Поэтому я готовый код и не привел.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.11.2016, 17:54
1 | #11
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,991
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от AY Посмотреть сообщение
вылезла проблема с блоками на басурманском языке (как мне кажется) - имя блока полученное функцией (vla-get-EffectiveName obj) или (vla-get-Name obj) не желает искаться в коллекции блоков (vla-item (vla-get-blocks doc) ..
Сравни
Цитата:
Команда:
Команда:
Команда:
Команда: _resetblock 1 блок сброшен.
Команда: (entget(car(entsel)))
Выберите объект: ((-1 . <Имя объекта: 7ffff705e80>) (0 . "INSERT") (330 . <Имя объекта: 7ffff7039f0>) (5 . "270") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbBlockReference") (2 . "BRÖTCHEN_00924") (10 2838.76 406.577 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 3.14159) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))
Команда:
и
Цитата:
Команда: (vla-get-EffectiveName (vlax-ename->vla-object(car(entsel))))
Выберите объект: "BROTCHEN_00924"
Команда:
vla методы неверно возвращают строки "на басурманском языке"
изменения 2.13 в этой сборке
Цитата:
;;; 2.13 - Добавлена функция BG:GET-TEXTSTRING (как замена vla-get-textstring. Т.к. неверно возвращает строку при наличии юникод символов)
Ну и пример с функцией оттуда
Код:
[Выделить все]
(setq doc (vla-get-activedocument (vlax-get-acad-object)))
(setq ent (car (entsel "\nSelect Block Ref: ")))
(setq bname (bg:block-get-name ent))
(setq blk (vla-item (vla-get-blocks doc) bname))
и сама функция
Код:
[Выделить все]
(defun bg:block-get-name (blockentity / name repbtag )
  (if (eq (type blockentity) 'VLA-OBJECT)(setq blockentity (vlax-vla-object->ename blockentity)))
;;;get from Lee Mac  LM:EffectiveName
;;; http://www.theswamp.org/index.php?topic=37493.0
;;; http://forum.dwg.ru/showthread.php?t=65082
;;----------------=={ Effective Block Name }==----------------;;
;;                                                            ;;
;;  Returns the effective name of a block.                    ;;
;;------------------------------------------------------------;;
;;  Author: Lee Mac, Copyright © 2011 - www.lee-mac.com       ;;
;;------------------------------------------------------------;;
;;  Arguments:                                                ;;
;;  blockentity - Block Reference Entity name                 ;;
;;------------------------------------------------------------;;
;;  Returns:  True block name as per the block definition     ;;
;;------------------------------------------------------------;;
 
  (if (wcmatch (setq name (cdr (assoc 2 (entget blockentity)))) "`**")
    (if
      (and
        (setq repbtag
          (cdadr
            (assoc -3
              (entget
                (cdr
                  (assoc 330
                    (entget (tblobjname "BLOCK" name))
                  )
                )
               '("AcDbBlockRepBTag")
              )
            )
          )
        )
        (setq repbtag (handent (cdr (assoc 1005 repbtag))))
      )
      (setq name (cdr (assoc 2 (entget repbtag))))
    )
  )
  name
)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 21.11.2016, 21:56
#12
AY

webcad.pro
 
Регистрация: 06.01.2005
Московская обл.
Сообщений: 501


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
AY, ты не путай ename для вхождений и ename для описаний. В твоем конкретном случае ситуация показалась мне достаточно запутанной, а времени разбираться нет. Поэтому я готовый код и не привел.
Так мне кажется, что не путаю... мне нужно найти ename описания имея ename вхождения... Я в первый момент надеялся, что ссылка на описание будет в списке вхождения и полез туда сразу, но вот ничего не нашел.

Цитата:
Сообщение от VVA Посмотреть сообщение
vla методы неверно возвращают строки "на басурманском языке"
Сейчас вечером нет под рукой автокада, поэтому код попробую только завтра, спасибо за ссылку.

Однако, сразу вопрос про команду resetblock - ее обязательно для каждого блока выполнять? Или все дело исключительно - только за тем, что бы тащить имя через entget?

И резюмируя - выходит, что проблемы не с тем, что автолисповские строки не поддерживают юникод, а конкретно с vla-* функциями? Это я от того спрашиваю, что уж несколько лет не слежу за нововведениями автолиспа и как обстоят нынче дела с юникодом не в курсе.
AY вне форума  
 
Непрочитано 21.11.2016, 22:25
#13
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,991
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от AY Посмотреть сообщение
разу вопрос про команду resetblock - ее обязательно для каждого блока выполнять?
Вообще не нужно, это для примера, чтобы entget вернул имя блока, а не *Uxxx

Цитата:
Сообщение от AY Посмотреть сообщение
Или все дело исключительно - только за тем, что бы тащить имя через entget?
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 22.11.2016, 10:58
#14
AY

webcad.pro
 
Регистрация: 06.01.2005
Московская обл.
Сообщений: 501


В общем ларчик просто открывался. Действительно, проблема обходится получением имени блока через entget вместо vla-get-name.

Спасибо откликнувшимся и отдельно VVA. Думаю прояснение вопроса было небесполезным.

В качестве ворчания заметим, что не дорабатывают в автодеске - при товарище Никсоне такого не было :)
AY вне форума  
 
Непрочитано 22.11.2016, 11:17
#15
Кулик Алексей aka kpblc
Moderator

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


AY, добавь динамику в блок, измени его и попробуй через ename получить его нормальное имя.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 22.11.2016, 14:36
#16
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,991
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
добавь динамику в блок, измени его и попробуй через ename получить его нормальное имя
Алексей, в примере #11 так и делается, только не через поле 2, а через ж... AcDbBlockRepBTag.
Еще этот вопрос обсуждали в этой теме Имена динамических блоков
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 22.11.2016, 22:52
#17
AY

webcad.pro
 
Регистрация: 06.01.2005
Московская обл.
Сообщений: 501


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
AY, добавь динамику в блок, измени его и попробуй через ename получить его нормальное имя.
Согласен - меняю формулировку "... моя проблема обходится через entget ...", а если у кого есть вероятность появления динамических блоков, VVA привел универсальный костыль код, которым и следует пользоваться всем заинтересованным лицам.

А то, что со стороны лиспа у динамических блоков не все гладко - спору нет - это собственно сразу в 2005г. стало понятно. Грубовато их в атокад вшили.
AY вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Получение объекта блока по объекту вставки

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамический блок внутри другого блока Engineer_Sergii Динамические блоки 5 12.07.2018 09:42
Невидимые блоки без имени после вставки 5hev AutoCAD 11 02.12.2015 18:02
Смещение точки вставки блока во внешних ссылках. bboysyndrom AutoCAD 6 27.07.2015 08:07
Получение разрешения на строительство объекта капитального строительства maxummm Прочее. Архитектура и строительство 18 25.08.2010 20:31