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

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

Просьба помочь разобраться со вставкой блока в lisp

Ответ
Поиск в этой теме
Непрочитано 30.03.2023, 14:26 #1
Просьба помочь разобраться со вставкой блока в lisp
Сыч
 
Регистрация: 05.04.2011
Сообщений: 45

Здравствуйте.
Пишу lisp, который будет в центральную точку замкнутых полилиний вставлять указанный пользователем блок. В итоге пока научил lisp находить центральную точку и ставить там... точку (для проверки, что центр найден верно). А вот вставка блока не даётся никак, пишет "ошибка: неверный тип аргумента: consp nil", хотя делаю аналогично найденным в интернете примерам. Просьба сказать, где ошибка.
Код:
[Выделить все]
 (defun c:block_in_polyline (/ blocksvet blocksvetname polysvet k_poly polysvet1 centr n pl k_X k_Y)
  (vl-load-com)
  (setq blocksvetname (getstring "\nВведите имя блока:"))                               			  ; запрос имени блока для вставки
  (if (eq blocksvetname "")                                                             			  ; если имя не введено, то
    (progn
      (setq blocksvet (car (entsel "\nВыберите блок для вставки: ")))				    			          ; указание блока на чертеже
      (setq blocksvetname (vla-get-EffectiveName (vlax-ename->vla-object blocksvet)))   			  ; получение имени выбранного блока
	    ;(setq blocksvetname (cdr (assoc 2 (entget blocksvet))))
    )
  )
  
  (setq n 0 k_poly 0)
  (princ "\nВыберете на чертеже полилинии:")
  (setq polysvet (ssget '((0 . "*POLYLINE"))))                                          			  ; выбор полилинии
  (if polysvet
    (setq k_poly (sslength polysvet))                                                           ; количество выбранных полилиний
    (princ "Полилинии не выбраны")
  )      
  
  (repeat k_poly
    (princ "Цикл пошёл")
    (setq polysvet1 (ssname polysvet n))                                                			  ; вычленение полилинии из набора
    (princ "Вычленение выполнено")																	                            ; получение центра замкнутой полилинии
    (foreach a (entget polysvet1)
  		(if (= (car a) 10)
   			(setq pl (cons (cdr a) pl))
  		)
 	  )                                 
    (setq center (eea-centroid-solid-pl pl))
    (princ center)
    
    (entmakex (list '(0 . "point") '(62 . 1) (cons 10 center) (assoc 210 (entget polysvet1))))  ; проверочная простановка точек
    
    (setq pl nil)
    (setq k_X (rtos (nth 0 centr)))
    (setq k_Y (rtos (nth 1 centr)))
    ;(vl-cmdf "_insert" blocksvetname centr)                              ; вставка блока
    ;(vl-cmdf "_insert" blocksvetname (strcat k_X "," k_Y ",0.00"))                              ; вставка блока
    ;(command "_insert" blocksvetname (strcat k_X "," k_Y ",0.00"))                              ; вставка блока
    (setq n (1+ n))                                                                     			  ; щёлкнул счетчик
  )
)
    
    
    
; by ElpanovEvgeniy
; Библиотечная функция, Центроид (центр масс) области, внутри многоугольника
; pl - список вершин полилинии (код 10)
; Дата создания 2000 - 2005 годы
; Последняя редакция 08.06.2009

(defun eea-centroid-solid-pl (pl)
(setq l 0)
 (mapcar
  (function /)
  (apply (function mapcar)
         (cons (function +)
               (mapcar (function (lambda (p1 p2 / BL I PL)
                                  (setq i (/ (- (* (car p1) (cadr p2)) (* (car p2) (cadr p1))) 2)
                                        l (+ i l)
                                        i (/ i 3)
                                  ) ;_  setq
                                  (mapcar (function (lambda (a b) (* (+ a b) i))) p1 p2)
                                 ) ;_  lambda
                       ) ;_  function
                       (cons (last pl) pl)
                       pl
               ) ;_  mapcar
         ) ;_  cons
  ) ;_  apply
  (list l l)
 ) ;_  mapcar
) ;_  defun
Чертёж, на котором тестировал, прилагаю.

Вложения
Тип файла: dwg
DWG 2018
Чертеж2.dwg (26.0 Кб, 4 просмотров)

Просмотров: 1007
 
Непрочитано 30.03.2023, 14:27
#2
Кулик Алексей aka kpblc
Moderator

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


Я бы посмотрел на vla-insert в справке.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 30.03.2023, 16:57
#3
Сыч


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


Спасибо за наводку. Удалось.
Правда, вариант, который я пытался до этого реализовать, тоже был рабочим. Я умудрился косячнуть в имени переменной , поэтому ничего не работало.
Но вариант с vla-insert, конечно, изящнее.
Код:
[Выделить все]
 (defun c:block_in_polyline (/ obj adoc mspace blocksvet vla_blocksvet blocksvetname polysvet k_poly polysvet1 centr n pl k_X k_Y)
  (vl-load-com)                                                                 ; загружаем функции расширения
  (setq obj (vlax-get-acad-object))                                             ; указатель на программу AutoCAD
  (setq adoc (vla-get-activedocument obj))                                      ; указатель на активный документ
  (setq mspace (vla-get-modelspace adoc))                                       ; указатель на пространство модели  
  
  (setq blocksvet (car (entsel "\nВыберите блок для вставки: ")))		  ; указание блока на чертеже
  (setq vla_blocksvet (vlax-ename->vla-object blocksvet))                       ; преобразование блока в vla-объект
  (setq blocksvetname (vla-get-EffectiveName vla_blocksvet))                    ; получение имени выбранного блока
    
  (setq n 0 k_poly 0)
  
  (princ "\nВыберете на чертеже полилинии:")
  (setq polysvet (ssget '((0 . "*POLYLINE"))))                                  ; выбор полилиний
  
  (if polysvet
    (setq k_poly (sslength polysvet))                                           ; количество выбранных полилиний
    (princ "Полилинии не выбраны")
  )      
  
  (repeat k_poly
    (setq polysvet1 (ssname polysvet n))                                        ; вычленение полилинии из набора
    (foreach a (entget polysvet1)                                               ; получение списка координат вершин полилинии
  		(if (= (car a) 10)
   			(setq pl (cons (cdr a) pl))
  		)
 	  )                                 
    
    (setq centr (eea-centroid-solid-pl pl))                                     ; получение центра замкнутой полилинии
    
    (setq pl nil)                                                               ; обнуление списка координат вершин полилинии
    
    (vla-insertblock mspace (vlax-3d-point centr) blocksvetname 1. 1. 1. 0)     ; вставка блока
    (setq n (1+ n))                                                             ; щёлкнул счетчик
  )
)
    
; by ElpanovEvgeniy
; Библиотечная функция, Центроид (центр масс) области, внутри многоугольника
; pl - список вершин полилинии (код 10)
; Дата создания 2000 - 2005 годы
; Последняя редакция 08.06.2009

(defun eea-centroid-solid-pl (pl)
(setq l 0)
 (mapcar
  (function /)
  (apply (function mapcar)
         (cons (function +)
               (mapcar (function (lambda (p1 p2 / BL I PL)
                                  (setq i (/ (- (* (car p1) (cadr p2)) (* (car p2) (cadr p1))) 2)
                                        l (+ i l)
                                        i (/ i 3)
                                  ) ;_  setq
                                  (mapcar (function (lambda (a b) (* (+ a b) i))) p1 p2)
                                 ) ;_  lambda
                       ) ;_  function
                       (cons (last pl) pl)
                       pl
               ) ;_  mapcar
         ) ;_  cons
  ) ;_  apply
  (list l l)
 ) ;_  mapcar
) ;_  defun
Сыч вне форума  
 
Непрочитано 30.03.2023, 20:20
#4
Кулик Алексей aka kpblc
Moderator

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


Offtop:
Цитата:
Сообщение от Сыч Посмотреть сообщение
Я умудрился косячнуть в имени переменной
Нейминг - он такой, суровый и беспощадный ))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Просьба помочь разобраться со вставкой блока в lisp



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как с помощью Lisp выполнить перемещение блока с изменением трассировки ортогональных полилиний присоединенных к блоку? alex_50 LISP 3 10.03.2022 10:42
СТО ЦКТИ 530.01-2009, Просьба помочь разобраться с текстом стандарта AlexFaba Прочее. Отраслевые разделы 0 20.10.2017 10:38
Прошу помочь разобраться с пьезометрическими графиками теплосети. Юрий_Нд Отопление 14 04.10.2017 13:54
Lisp. авто-нумерация атрибута блока. DonJad LISP 10 26.10.2014 02:04
Доработка кодя для скрытия объектов блока (LISP) AndruxaZ LISP 2 22.09.2014 14:27