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

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

Как при создании блока через LISP задать ему единицы блока - миллиметры? Как удалить объекты, из которых создается блок?

Ответ
Поиск в этой теме
Непрочитано 19.08.2022, 11:45 #1
Как при создании блока через LISP задать ему единицы блока - миллиметры? Как удалить объекты, из которых создается блок?
konstryktor
 
Регистрация: 15.02.2015
Сообщений: 233

Добрый день! Нашел на форуме такой код (добавил вставку блока). Блок создается как безразмерный, какой командой сделать чтобы единицы создаваемого блока были миллиметры? Как сделать, чтобы при создании либо в момент вставки блока примитивы из которых он создается удалялись? Как сделать чтобы в системе координат блока базовая точка имела координаты 0,0,0?)

Код:
[Выделить все]
 ;*********************************************************
;;			BLOCK ENTMAKE			;;
;*********************************************************

; Определение заголовка блока :

(defun ent-block-header (name pt)
(entmake (list
(cons 0 "BLOCK")
(cons 2 name)
(cons 8 "0")
(cons 70 2)
(cons 3 "")
(cons 10 pt))))

; Определение отдельного субпримитива блока :
(defun ent-block-sub (ent)
(entmake
    (vl-remove-if
	(function (lambda (x)
	(member (car x) '(5 330))))
	    (cdr (entget ent )))))  

; Определение субпримитивов из набора выбора :
(defun ent-ss (ss / i ss1)
     (setq i 0 ss1 (ssadd))
          (repeat (sslength ss)  
            (ent-block-sub (ssname ss i))
	    (ssadd (entlast) ss1)
            (setq i (1+ i)))
  ss1
  )

;Определение атрибута :
(defun ent-attdef (pt tag pmt val)
(entmake (list
'(0 . "ATTDEF")
'(100 . "AcDbEntity")
(cons 10 pt)
(cons 40 (getvar "TEXTSIZE"))
'(8 . "0")
'(100 . "AcDbText")
(cons 1 val)
(cons 3 pmt)
(cons 7 "Standard")
'(100 . "AcDbAttributeDefinition")
(cons 2 tag)
'(70 . 0)))
)

; Определение окончания блока :
(defun ent-endblk ()
(entmake '((0 . "ENDBLK")(8 . "0"))))

; Основная программа :
(defun C:emake (/ at i name pa pmt pt ss ss1 tag val)
(prompt "\n  >> Указать примитивы для создания определения блока >>\n")
(if (and (setq ss (ssget)
	       pt (getpoint "\nБазовая точка блока:\n")
	       name (getstring "\nИмя блока\n")))  
    (progn
      (setq ss1 (ssadd))
      (ent-block-header name pt)      
      (while (setq pa (getpoint "\nТочка вставки атрибута (Enter без атрибутов) :\n"))
		(setq  tag (strcase (getstring "\nТаг атрибута:\n"))
		      pmt (getstring T "\nПодсказка атрибута:\n")
		     val (getstring "\nЗначение атрибута:\n"))           
      (ent-attdef pa tag pmt val)      
      (ssadd (entlast) ss))
      (setq ss1 (ent-ss ss))
      (ent-endblk)
      (setq i 0)
          (repeat (sslength ss1)  
            (ssdel (ssname ss1 i) ss1)
            (setq i (1+ i)))
(command "_insert" name pt 0 0 l) 
      )
  (princ "\nОтмена создания блока\n"))
  (princ)
  )
  (prompt "\n\t>>\tВ командной строке ввести emake \t\n")
  (princ)
;	TesT :
;	(C:emake)
;	(princ)

Последний раз редактировалось konstryktor, 19.08.2022 в 13:06.
Просмотров: 1714
 
Непрочитано 21.08.2022, 13:24
#2
Кулик Алексей aka kpblc
Moderator

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


Ищи в DXF Reference "unitless". Сейчас глянул, там надо в BLOCK_RECORD залезать. Offtop: Я бы, наверное, использовал ActiveX для решения такой задачи
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 23.08.2022, 15:55
#3
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 451


А безкомандный способ создания блока - это принципиальное условие?
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 23.08.2022, 16:54
#4
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
А безкомандный способ создания блока - это принципиальное условие?
каждая команда - это прерывание пользовательской функции с временной передачей управления самому акаду (вне зависимости от языка программирования). Поэтому чем меньше командных методов - тем больше предсказуемость (стабильность) работы пользовательского кода)
Сергей812 вне форума  
 
Непрочитано 24.08.2022, 13:11
#5
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


Цитата:
Сообщение от konstryktor Посмотреть сообщение
Как при создании блока через LISP задать ему единицы блока - миллиметры? Как удалить объекты, из которых создается блок?
в первом приближении

Код:
[Выделить все]
 ;*********************************************************
;;
;;			BLOCK ENTMAKE
;;
;*********************************************************

; Определение заголовка блока :

(defun ent-block-header (name pt)
	(entmake (list (cons 0 "BLOCK")
				   (cons 2 name)
				   (cons 8 "0")
				   (cons 70 2)
				   (cons 3 "")
				   (cons 10 pt)
			 )
	)
)

; Определение отдельного субпримитива блока :
(defun ent-block-sub (ent)
	(entmake
	    (vl-remove-if (function (lambda (x) (member (car x) '(5 330))))
		    		  (cdr (entget ent ))
		)
	)
)

; Определение субпримитивов из набора выбора :
(defun ent-ss (ss / i ss1)
     (setq i 0 ss1 (ssadd))
     (repeat (sslength ss)
     (ent-block-sub (ssname ss i))
	 (ssadd (entlast) ss1)
     (setq i (1+ i)))
  	 ss1
)

;****************************************************************** koMon
;Определение атрибута :
;(defun ent-attdef (pa tag pmt val / attdef_ename)
;		(entmakex (list '(0 . "ATTDEF")
;						'(100 . "AcDbEntity")
;						'(410 . "Model")
;						'(8 . "0")
;						'(100 . "AcDbText")
;						(cons 10 pa)
;						(cons 40 (getvar 'textsize))
;						(cons 1 val)
;						(cons 7 (getvar 'textstyle))
;						'(100 . "AcDbAttributeDefinition")
;						(cons 3 pmt)
;						(cons 2 tag)
;						'(70 . 0)
;				 )
;	   )
;)
;****************************************************************** koMon

; Определение окончания блока :
(defun ent-endblk ()
	(entmake '((0 . "ENDBLK")(8 . "0")))
)

; Основная программа :
(defun c:emake (/ at i name pa pmt pt ss ss1 tag val block_definition_object)
	(prompt "\n  >> Указать примитивы для создания определения блока >>\n")
	(if (and (setq ss (ssget)
		     pt (getpoint "\nБазовая точка блока:\n")
		     name (getstring "\nИмя блока\n"))
		)
	    	(progn
	    		(setq ss1 (ssadd))
	    		(ent-block-header name pt)
	    		(while (setq pa (getpoint "\nТочка вставки атрибута (Enter без атрибутов): \n"))
				  	(setq tag (strcase (getstring "\nТаг атрибута:\n"))
				  		  pmt (getstring T "\nПодсказка атрибута:\n")
				  		  val (getstring "\nЗначение атрибута:\n")
					)

					;********************************************** koMon
					(vla-put-layer (vla-addattribute (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
													 (getvar 'textsize)
													 acattributemodeverify
													 pmt
													 (vlax-3d-point pa)
													 tag
													 val
								   )
								   "0"
					)
;	    			(ent-attdef pa tag pmt val)
					;********************************************** koMon

	    			(ssadd (entlast) ss)
				)
;	    		(setq ss1 (ent-ss ss))	;************************** koMon
	    		(ent-ss ss)             ;************************** koMon
	    		(ent-endblk)

				;************************************************** koMon
;	    		(setq i 0)
;	    		(repeat (sslength ss1)
;	    	  		(ssdel (ssname ss1 i) ss1)
;	    	  		(setq i (1+ i))
;				)
				(command "_.erase" ss "")
				(setq block_definition_object (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) name)
					  i -1
				)
				(vla-put-units block_definition_object acinsertunitsmillimeters)
				(vla-put-origin block_definition_object (vlax-3d-point '(0 0 0)))
				(repeat (vla-get-count block_definition_object)
					(vla-move (vla-item block_definition_object (setq i (1+ i))) (vlax-3d-point pt) (vlax-3d-point '(0 0 0)))
				)
				(command "_.-insert" name pt 1 1 0)
				;************************************************** koMon
      		)
  			(princ "\nОтмена создания блока\n")
	)
  	(princ)
)
(prompt "\n\t>>\tВ командной строке ввести emake \t\n")
(princ)
koMon вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как при создании блока через LISP задать ему единицы блока - миллиметры? Как удалить объекты, из которых создается блок?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как добавить в блок запись, доступную из всех экземпляров блока? valerik88 LISP 0 02.07.2016 17:36
Lisp. авто-нумерация атрибута блока. DonJad LISP 10 26.10.2014 02:04
Как удалить существующий блок? dextron3 Динамические блоки 21 24.12.2012 10:19
LISP: возможно ли выбрать через ssget рамкой объекты разных типов? cj_lex LISP 5 20.04.2012 10:54
Срочно Удалить Блок Олег Вещий Динамические блоки 9 24.01.2008 08:26