ЛИСП: как извлечь свойство блока "аннотативный масштаб"?
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > ЛИСП: как извлечь свойство блока "аннотативный масштаб"?

ЛИСП: как извлечь свойство блока "аннотативный масштаб"?

Ответ
Поиск в этой теме
Непрочитано 24.04.2012, 16:23 #1
ЛИСП: как извлечь свойство блока "аннотативный масштаб"?
cj_lex
 
Регистрация: 15.12.2011
Сообщений: 29

Доброго времени суток.
Подскажите, пожалуйста, как извлечь свойство блока "аннотативный масштаб"?
entget и activex ковырял, но не нашел.
Необходимость в этам выплыла когда вставляю блок строкой вида (command "_insert" bl_name insert_point bl_scale bl_dir), у вставляемого блока установлено свойство одинаковый масштаб по осям, но если он еще и аннотативный, то масштаб запрашивается ДВА раза, отдельно для каждой оси, причем если вставлять блок "вручную", то масштаб запрашивается один раз, а если через command, то два раза, не смотря на установленное свойство "одинаковый масштаб".

Код:
[Выделить все]
(setq bl_name "ИИ051141")

Команда: (command "_insert" bl_name)
Точка вставки или [Базовая точка/Масштаб/X/Y/Z/ПОворот]:
Введите масштаб по оси X, укажите второй угол или [Угол/XYZ] <1>:

Команда: (command "_insert")
Имя блока или [?] <ИИ051141>:ИИ051141
Точка вставки или [Базовая точка/Масштаб/Поворот]: Укажите масштаб <1>:
Кто-нибудь сталкивался?

autocad civil 3d 2012 64, win7 64
Заранее спасибо.
Просмотров: 5207
 
Непрочитано 24.04.2012, 16:36
#2
Кулик Алексей aka kpblc
Moderator

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


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


 
Регистрация: 15.12.2011
Сообщений: 29


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А если вставлять не командой?
По-другому пока не умею(((
Да и программа такая (вставка блоков на основе текстового файла с набором параметров - координаты, слой, угол поворота, значения атрибутов и т.д.), старался сделать универсальной, для любых блоков с любым количеством атрибутов и анализом на многострочность этих атрибутов. Безупречно работала до сегодняшнего дня, когда столкнулся с тем что в одном блоке попалось "одинаковый масштаб" и "аннотативный масштаб".
"логика программы": у пользователя спрашивается "блок для образца", потом csv-файл с набором параметров, потом выводится окошко, в котором пользователь сопоставляет параметры блока и атрибуты (если они есть) со столбцами csv-файла

Последний раз редактировалось cj_lex, 24.04.2012 в 17:32.
cj_lex вне форума  
 
Непрочитано 24.04.2012, 17:07
#4
Кулик Алексей aka kpblc
Moderator

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


Образец своего текстового файла скинь.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 24.04.2012, 17:14
#5
cj_lex


 
Регистрация: 15.12.2011
Сообщений: 29


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Образец своего текстового файла скинь.
несколько строк csv-файла
Код:
[Выделить все]
 
слой;X;Y;Z;угол поворота
2;2166808.189697559;6206360.209268117;0.00;71.14
2;2166808.189697560;6206360.209268117;0.00;259.82
2;2167210.651138730;6206726.294543906;0.00;8.01
2;2167210.651138730;6206726.294543906;0.00;188.00
2;2177979.642288839;6214370.883990519;0.00;270.73
2;2174638.067774850;6214137.570982909;0.00;36.75
2;2174638.067774850;6214137.570982909;0.00;216.53
2;2174614.404923665;6214169.623390423;0.00;36.81
только тогда надо и саму программу выкладывать, она немаленькая, из нескольких функций, dcl и пр....
...за сегодня не успею выдернуть текст всех функций, которые используются в данной "программе", а скидывать сюда целиком проект (файл LSP) - там почти 30 000 строк...

Последний раз редактировалось cj_lex, 24.04.2012 в 17:25.
cj_lex вне форума  
 
Непрочитано 25.04.2012, 01:14
1 | #6
Кулик Алексей aka kpblc
Moderator

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


Если честно, то с моей точки зрения, такой формат недостаточен. ИМХО надо указывать имя блока, слой, на который его вставлять, тип и вес линии (кстати, не забыть про загрузку соответствующего типа линии), цвет блока (ICA или RGB), координаты вставки в OCS, нормаль блока, угол поворота в OCS (кстати, удобнее их задавать в градусах, минутах и секундах - человеку эта информация более понятна, а программную обработку сделать можно), а потом уже идут атрибуты (парами - тэг=значение, тэг=значение...). Ну и не забыть про обработку пропущенных данных...
Т.е., если приводить файл к некоему порядку, то получится нечто типа
Код:
[Выделить все]
ИмяБлока         // пропущено - берется из предыдущей строки.
СлойБлока        // пропущено - блок вставляется на текущий слой.
                 // Если слой не существовал, он создается с настройками "по умолчанию"
ТипЛинии         // пропущено - устанавливается "ПоСлою"
ФайлТипаЛинии    // из этого файла выполняется загрузка типа линии. Возможно указание полного пути до файла.
                 // Если пропущено - используется acad.lin или acadiso.lin (в зависимости от значение системной переменной measurement
ВесЛинии         // пропущено - устанавливается "ПоСлою"
ЦветБлока        // пропущено - устанавливается "ПоСлою". 
                 // Если указывается просто число от 0 до 256 - то это ICA-цвет.
                 // Если указывается три числа, разделенные запятыми, то это RGB-представление цвета
КоординатыВставки // числа, разделенные запятыми.
НормальВставки   // то же
МасштабыВставки  // МасштабХ,МасштабY,МасштабZ
УголПоворота     // записывается в формате "градусы","минуты","секунды"
Арибут1          // Записывается в формате "ТэгАтрибута=ЗначениеАтрибута"
Атрибут2         // Записывается в формате "ТэгАтрибута=ЗначениеАтрибута"
АтрибутN         // Записывается в формате "ТэгАтрибута=ЗначениеАтрибута"
При этом вставка будет выполняться в пространство модели, а не в текущее пространство.
---
Вот в таком случае программа получится более-менее сносной и, может быть, даже немного универсальной. Но все равно, вряд ли там будет 30 000 строк...
---
А в имеющемся варианте вставлять блок, по-моему, достаточно просто, особенно если известно его имя и его описание гарантированно существует в файле:
Код:
[Выделить все]
 (vl-load-com)

(defun insert (file block-name / _kpblc-conv-string-to-list handle str lst blk_ref)
              ;|
*    file  - имя файла с описанием вставок
*    block-name - имя блока
|;

  (defun _kpblc-conv-string-to-list (string separator / i)
                                    ;|
*    Функция разбора строки. Возвращает список либо точечную пару.
*    Параметры вызова:
*	string		разбираемая строка
*	separator	символ, используемый в качестве разделителя частей
*    Примеры вызова:
(_kpblc-conv-string-to-list "1;2;3;4;5;6" ";")	;'(1 2 3 4 5 6)
(_kpblc-conv-string-to-list "1;2" ";")		;'(1 2)
*    За основу взяты уроки Евгения Елпанова по рекурсиям
|;
    (cond
      ((= string "") nil)
      ((vl-string-search separator string)
       ((lambda (/ pos res)
          (while (setq pos (vl-string-search separator string))
            (setq res    (cons (substr string 1 pos) res)
                  string (substr string (+ (strlen separator) 1 pos))
                  ) ;_ end of setq
            ) ;_ end of while
          (reverse (cons string res))
          ) ;_ end of lambda
        )
       )
      (t (list string))
      ) ;_ end of cond
    ) ;_ end of defun

  (if (and (tblobjname "block" block-name)
           (findfile file)
           ) ;_ end of and
    (progn
      (setq handle (open file "r"))
      (while (setq str (read-line handle))
        (setq lst (cons str lst))
        ) ;_ end of while
      (close handle)
      (foreach item (cdr (reverse lst))
        (setq item (_kpblc-conv-string-to-list item ";"))
        (setq blk_ref (vla-insertblock (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
                                       (vlax-3d-point (list (cadr item)
                                                            (caddr item)
                                                            (cadddr item)
                                                            ) ;_ end of list
                                                      ) ;_ end of vlax-3d-point
                                       block-name
                                       1.
                                       1.
                                       1.
                                       (last item)
                                       ) ;_ end of vla-InsertBlock
              ) ;_ end of setq
        (if (not (tblobjname "layer" (car item)))
          (vla-add (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) (car item))
          ) ;_ end of if
        (if (tblobjname "layer" (car item))
          (vla-put-layer blk_ref (car item))
          ) ;_ end of if
        ) ;_ end of foreach
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun
Код не гонял ни разу.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 25.04.2012, 10:36
#7
cj_lex


 
Регистрация: 15.12.2011
Сообщений: 29


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
такой формат недостаточен
согласен, буду доделать. пока пользователей устраивает и в таком виде, т.к. в основном идет обработка атрибутов (блоки->excel/access->другие_блоки)

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
вряд ли там будет 30 000 строк...
30 000 строк - это весь проект, в котором порядка 150 отдельных программ

спасибо за код и наводку на vla-insertblock, буду разбираться и потихоньку уходить от (command "_insert"....)

возвращаясь к теме: никто не подскажет, как извлечь свойство блока "аннотативный"?
cj_lex вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > ЛИСП: как извлечь свойство блока "аннотативный масштаб"?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как увидть атрибуты блока через лисп? Pr9nik LISP 34 10.10.2022 06:43
ЛИСП: как извлечь свойство блока "одинаковый масштаб"? cj_lex LISP 4 16.04.2012 15:02
свойство динамичного блока в его атрибуте Pave1 AutoCAD 14 29.12.2011 20:31
Как осуществить перебор примитивов блока на Лиспе и извлечь данные по DBX-коду? DmitriM LISP 9 16.08.2010 23:44
Как извлечь из блока константные атрибуты (на AutoLISP)? Matt LISP 5 19.04.2007 21:12