Rekomendowane odpowiedzi

Opublikowano

Dzień dobry.

W pewnym lispie chciałbym wykorzystywać blok o nazwie znacznik.
Blok ten składa się z linii prostej pionowej o długości 0.1
Ponieważ nie potrafię stworzyć czegoś takiego przy pomocy entmake...jak na poniższych przykładach:
https://www.zwcad.pl/3-tworzenie-i-modyfikacja-obiektow.html

skorzystałem z lispa Lee Mac'a:
http://www.cadtutor.net/forum/showthread.php?45495-Block-creation-and-insertion-Lisp-Template

i wygląda to tak:

(defun c:zna ()
;tworzenie definicji bloku "znacznik"
;ale najpierw definicja linii
(setq LiniaDef
		(entmake 
			(list 
				'(0 . "LINE") 
				'(100 . "AcDbEntity") 
				'(100 . "AcDbLine")
				'(62 . 0)
				'(370 . -2)
				(cons 10 (list 0.1 0.1 0)) 
				(cons 11 (list 0.1 0 0 ))
			)))
;teraz blok z tej linii
;kod stworzony przez Lee Mac ~11.01.10
(setq P40 (list 0.1 0.1 0))
(cond (  (not (setq ss (ssget (list 0.1 0.1 0)))))

        (  (repeat 1
             (progn
               (setq bNme "znacznik")

               (cond (  (not (snvalid bNme))
                        (princ "\n** Invalid Block Name **"))

                     (  (tblsearch "BLOCK" bNme)
                        (princ "\n** Block Already Exists **"))))))

        (  (not (setq i -1 pt (list 0.1 0.1 0))))

        (t (entmake (list (cons 0 "BLOCK") (cons 10 pt) (cons 2 bNme) (cons 70 0)))

           (while (setq ent (ssname ss (setq i (1+ i))))
             (entmake (entget ent))
             (entdel ent))

           (entmake (list (cons 0 "ENDBLK") (cons 8 "0")))
           (entmake (list (cons 0 "INSERT") (cons 2 bNme) (cons 10 pt)))))

  (princ)
;Koniec tworzenia bloku
;usuwanie utworzonego bloku lub linii (jeżeli blok już istniał)
(setq P41 (list 0 0 0))
(setq P42 (list 1 1 0))
(command "_zoom" "_w" P41 P42)
(command "_erase" (ssget P40) "")
;(command "_zoom" "_p")
 (princ)
);KONIEC

Problem się pojawia w trzeciej linijce od końca. Jeżeli ta linijka jest aktywna to usuwa także definicję bloku "znacznik".
Może jest lepszy sposób na kasowanie stworzonych obiektów np bez konieczności migania widokiem?

Pozdrawiam i dziękuję za ewentualną pomoc

 

Opublikowano

Korzystając z entmake, rzeczywiście trochę skomplikowane. A może wystarczy utworzyć blok tak:


(vl-load-com)

(defun GetModelspace ( / ) 
	(vla-get-Modelspace (vla-get-activedocument (vlax-get-acad-object) ) )
)

(defun UtworzZnacznik ( / blocks bNme blok ) 
	(setq blocks (vlax-get-property (vla-get-activedocument (vlax-get-acad-object) ) 'Blocks  ) )
	(setq bNme "znacznik")
	(setq blok (vlax-invoke-method blocks 'Add (vlax-3d-point (list 0 0 0 ) ) bNme ) )
	(vlax-invoke-method blok 'AddLine (vlax-3d-point (list 0 0 0 ) ) (vlax-3d-point (list 0 0.1 0  ) ) )
	blok
)

(defun C:WstawZnacznik ( / ) 
	(setq bNme "znacznik")
	(setq blok (tblsearch "BLOCK" bNme) )
	(if (null blok )
		(setq blok (UtworzZnacznik) )
	)
	(vlax-invoke-method (GetModelspace) 'InsertBlock (vlax-3d-point ( getpoint "Gdzie wstawić" ) ) bNme 1 1 1 0 )
)

 

blok.lsp

  • dmatusz3 zmienił(a) tytuł na Tworzenie bloku [rozwiązany]
  • dmatusz3 zablokował(a) ten temat
Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.