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

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

LISP: Как правильно создать описание блока программно?

Ответ
Поиск в этой теме
Непрочитано 09.03.2013, 21:03 #1
LISP: Как правильно создать описание блока программно?
WhiteShark
 
Регистрация: 30.03.2012
Сообщений: 101

Товарищи! Ставится такая задача: нужно я рисую полилинию и после того как я делаю её замкнутой, должен создаться блок (без использования команды block конечно) из неё и допустим определенного количества атрибутов с именем по шаблону "имя_#".

Вообще интересуют такие моменты в принципе как:

1. создание описания блока (желательно с атрибутами) на LISPe. Какие пары и в каких таблицах необходимы и достаточны? Или никто так не делает, а все делают с помощью команды block? Может у кото то есть готовый код приближенно решающий такую задачу?

2. вешать ли это дело на реактор (к примеру модификации базы или endCommand для polyline) или лучше просто сделать отдельную процедуру?

3. есть ли какая то готовая функция, которая находит центр тяжести фигуры, описанной замкнутой полилинией (как например, у штриховок) или надо самому через математику это решать?

4. как вставить block reference опять же программно, то есть без использования команды insert?

Последний раз редактировалось WhiteShark, 15.03.2013 в 19:27.
Просмотров: 4173
 
Непрочитано 13.03.2013, 11:21
#2
Klo

Инженер-конструктор
 
Регистрация: 29.10.2007
Юбилейный МО
Сообщений: 266


Я создавал описание блока (1-ый вопрос) примерно так.

Код:
[Выделить все]
 (defun areablock_definiton ()
;BLOCK Header definition:
(setq new_block (vla-Add drawingBlocks (vlax-3D-point '(0. 0. 0.)) "Room_name"))
(if  (= (tblobjname "layer" "_prem_No") nil)
(progn
(entmake '((0 . "LAYER") (100 . "AcDbSymbolTableRecord") (100 . "AcDbLayerTableRecord") (2 . "_prem_No") (70 . 0) (62 . 7) (6 . "Continuous")))
)
)

(setq text_style (list (cons 7 (getvar "TEXTSTYLE"))))
;Text ATTRIBUTE's definitions:
(setq roomNumber_attribute (vla-AddAttribute new_block 2.5 acAttributeModeNormal "Номер" (vlax-3D-point '(0.0 0.0 0.0)) "No" ""))
(vla-put-Alignment roomNumber_attribute acAlignmentTopCenter)
(vla-put-Layer roomNumber_attribute "_prem_No")

; Вставка блока в чертёж

(setq ptniv (getpoint "\nInsertion point: "))
(setq tx_No (strcat tx_No_prefix tx_No_value))
(setq tx_name " ")

; Проверка существования описания блока
(if (null (tblsearch "BLOCK" "Room_name"))(areablock_definiton))

; Вставка блока
(command "_-insert" "Room_name" ptniv 100 "" 0 tx_No tx_name "" tx_area)
В реакторах не разбираюсь.
Готовую функцию центра тяжести посмотри в разделе "готовые функции"
Над вставкой программно не заморачивался, меня вполне устраивал insert.
Klo вне форума  
 
Автор темы   Непрочитано 13.03.2013, 11:56
#3
WhiteShark


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


Klo, большое спасибо за код и за направление в котором копать!
Пока никто не отвечал я в принципе кое что и сам догнал. Может и так все знают, но акад ставит не центр тяжести для штриховок и т.п., а центр описанного прямоугольника.
WhiteShark вне форума  
 
Непрочитано 14.03.2013, 10:21
#4
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от Klo Посмотреть сообщение
Над вставкой программно не заморачивался, меня вполне устраивал insert.
Код:
[Выделить все]
; Вставка блока
(command "_-insert" "Room_name" ptniv 100 "" 0 tx_No tx_name "" tx_area)
А если окажется вдруг значение переменной ATTREQ = 0, то поимеем ошибку.
Do$ вне форума  
 
Непрочитано 14.03.2013, 12:22
#5
Klo

Инженер-конструктор
 
Регистрация: 29.10.2007
Юбилейный МО
Сообщений: 266


Do$
Спасибо за замечание. Не помешает установить значение этой переменной в 1 с сохранением текущего значения.
Код:
[Выделить все]
 ;установка системной переменной attreq=1 с сохранением текущего значения
(setq cur_attreq (getvar "attreq")) (setvar "attreq" 1)
;Вставка блока
(command "_-insert" "Room_name" ptniv 100 "" 0 tx_No tx_name "" tx_area)
(setvar "attreq" cur_attreq)
Klo вне форума  
 
Непрочитано 15.03.2013, 15:11
#6
VVA

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


Код:
[Выделить все]
(defun c:ENTMAKE_BLOCK ( )
    
    (if (not (tblsearch "BLOCK" "TPBLK"))
        (progn
            (if (not (tblsearch "STYLE" "Gen-Text"))
                (entmake
                    (list
                        (cons 0 "STYLE")
                        (cons 100 "AcDbSymbolTableRecord")
                        (cons 100 "AcDbTextStyleTableRecord")
                        (cons 2 "Gen-Text")
                        (cons 70 0)
                        (cons 40 2.5)
                        (cons 3 "Arial.ttf")
                    )
                )
            )
            
            (entmake
                (list
                    (cons 0 "BLOCK")
                    (cons 8 "0")
                    (cons 370 0)
                    (cons 2 "TPBLK")
                    (cons 70 2)
                    (cons 4 "Block to Place Trial pit Locations")
                    (list 10 0.0 0.0 0.0)
                )
            )
            (entmake
               (list
                   (cons 0 "LWPOLYLINE")
                   (cons 100 "AcDbEntity")
                   (cons 100 "AcDbPolyline")
                   (cons 8 "0")
                   (cons 90 4)
                   (cons 70 1)
                   (list 10 -2.0 2.0)
                   (list 10  2.0 2.0)
                   (list 10  2.0 -2.0)
                   (list 10 -2.0 -2.0)
               )
            )
            
            (entmake
                (list
                    (cons 0 "LINE")
                    (cons 8 "0")
                    (cons 6 "Continuous")
                    (cons 370 0)
                    (list 10 0.0 -3.0 0.0)
                    (list 11 0.0 3.0 0.0)                    
                )
            )
            
            (entmake
                (list
                    (cons 0 "LINE")
                    (cons 8 "0")
                    (cons 6 "Continuous")
                    (cons 370 0)
                    (list 10 -3.0 0.0 0.0)
                    (list 11 3.0 0.0 0.0)                    
                )
            )            
    
            (entmake
                (list
                    (cons 0 "ATTDEF")
                    (cons 8 "0")
                    (cons 370 0)
                    (cons 7 "Gen-Text")
                    (list 10 2.5 3.5 0.0)
                    (list 11 2.5 3.5 0.0)
                    (cons 40 3.5)
                    (cons 1 "TP-00")
                    (cons 3 "Trial pit Location")
                    (cons 2 "TP")
                    (cons 70 0)
                    (cons 72 0)
                    (cons 74 2)
                )
            )
            
            (entmake
                (list
                    (cons 0 "ENDBLK")
                    (cons 8 "0")
                )
            )
          
        )
    )

    (princ)
)


Ну и здесь почитать entmake и block/insert. Там entmake и vla-add
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 15.03.2013, 15:33
#7
WhiteShark


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


VVA, спасибище огромное! Как всегда - то что надо!
WhiteShark вне форума  
 
Непрочитано 09.05.2013, 23:23
#8
AndruxaZ


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


VVA, а если в блоке два атрибута, причем для одного должны быть параметры - Preset - YES, остальные - NO; для второго Preset - YES, Invisible - YES, остальные - NO
вот попытался что-то наваять на вашей основе. Правильно ли?
Код:
[Выделить все]
 (defun c:ENTMAKE_BLOCK ( )
    
    (if (not (tblsearch "BLOCK" "TPBLK"))
        (progn
            (if (not (tblsearch "STYLE" "Gen-Text"))
                (entmake
                    (list
                        (cons 0 "STYLE")
                        (cons 100 "AcDbSymbolTableRecord")
                        (cons 100 "AcDbTextStyleTableRecord")
                        (cons 2 "Gen-Text")
                        (cons 70 0)
                        (cons 40 2.5)
                        (cons 3 "Arial.ttf")
                    )
                )
            )
            
            (entmake
                (list
                    (cons 0 "BLOCK")
                    (cons 8 "0")
                    (cons 370 0)
                    (cons 2 "TPBLK")
                    (cons 70 2)
                    (cons 4 "Block to Place Trial pit Locations")
                    (list 10 0.0 0.0 0.0)
                )
            )
            (entmake
               (list
                   (cons 0 "LWPOLYLINE")
                   (cons 100 "AcDbEntity")
                   (cons 100 "AcDbPolyline")
                   (cons 8 "0")
                   (cons 90 4)
                   (cons 70 1)
                   (list 10 -2.0 2.0)
                   (list 10  2.0 2.0)
                   (list 10  2.0 -2.0)
                   (list 10 -2.0 -2.0)
               )
            )
            
            (entmake
                (list
                    (cons 0 "LINE")
                    (cons 8 "0")
                    (cons 6 "Continuous")
                    (cons 370 0)
                    (list 10 0.0 -3.0 0.0)
                    (list 11 0.0 3.0 0.0)                    
                )
            )
            
            (entmake
                (list
                    (cons 0 "LINE")
                    (cons 8 "0")
                    (cons 6 "Continuous")
                    (cons 370 0)
                    (list 10 -3.0 0.0 0.0)
                    (list 11 3.0 0.0 0.0)                    
                )
            )            
    
            (entmake
                (list
                    (cons 0 "ATTDEF")
                    (cons 8 "0")
                    (cons 370 0)
                    (cons 7 "Gen-Text")
                    (list 10 2.5 3.5 0.0)
                    (list 11 2.5 3.5 0.0)
                    (cons 40 3.5)
                    (cons 1 "TP-00")
                    (cons 3 "Trial pit Location")
                    (cons 2 "TP")
                    (cons 70 8)
                    (cons 72 1)
                    (cons 74 2)
                )
            )
            (entmake
                (list
                    (cons 0 "ATTDEF")
                    (cons 8 "0")
                    (cons 370 0)
                    (cons 7 "Gen-Text")
                    (list 10 2.0 0.0 0.0)
                    (list 11 2.0 0.0 0.0)
                    (cons 40 1.5)
                    (cons 1 "2")
                    (cons 3 "Trial pit Location")
                    (cons 2 "L")
                    (cons 70 1)
                    (cons 72 1)
                    (cons 74 2)
                )
            )
            (entmake
                (list
                    (cons 0 "ENDBLK")
                    (cons 8 "0")
                )
            )
          
        )
    )

    (princ)
)
AndruxaZ вне форума  
 
Непрочитано 10.05.2013, 11:28
#9
VVA

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


Цитата:
Сообщение от AndruxaZ Посмотреть сообщение
Правильно ли?
AndruxaZ, У меня сейчас нет Автокада под руками, чтобы проверить. Самый простой способ проверить - выполнить код.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 10.05.2013, 21:02
#10
AndruxaZ


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


Выполнил лисп - вроде работает.
VVA, подскажите при создании полилинии в данном лиспе, как задать точки прямоугольника, считывая данные из переменных ?
AndruxaZ вне форума  
 
Непрочитано 10.05.2013, 21:22
#11
VVA

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


AndruxaZ, Почему переменных во множественном числе? Переменная должна быть одна - список точек
Для LW полилинии
Код:
[Выделить все]
(defun LWPoly (lst cls)
;_ lst - список точек
;_ cls - признак замкнутости 0 - разомкнута 1 - замкнута
;_Использование
;_ (LWPOLY (list '(0 0) '(0 100) '(100 100) '(100 0)) 1)
  (entmakex (append (list (cons 0 "LWPOLYLINE")
                          (cons 100 "AcDbEntity")
                          (cons 100 "AcDbPolyline")
                          (cons 90 (length lst))
                          (cons 70 cls))
                    (mapcar (function (lambda (p) (cons 10 p))) lst))))
Для 3D mи "старых"/сглаженных полилиний
Код:
[Выделить все]
(defun Polyline (lst)
  (entmakex (list (cons 0 "POLYLINE")
                  (cons 10 '(0 0 0))))
  (mapcar
    (function (lambda (p)
                (entmake (list (cons 0 "VERTEX") (cons 10 p))))) lst)
  (entmakex (list (cons 0 "SEQEND"))))
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP: Как правильно создать описание блока программно?

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как программно создать полилинию? mamuk Программирование 5 30.05.2011 11:44
Подскажите, пожалуйста, как сделать описание (description) для блока? Ламер AutoCAD 5 27.08.2009 14:33
Создать блок Creator Динамические блоки 25 08.02.2008 19:11
Описание блока Малюк AutoCAD 7 27.07.2007 12:54
Описание блока Малюк AutoCAD 3 27.06.2007 14:15