Autore |
Discussione |
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
Inserito il - 05 settembre 2011 : 09:14:32
|
Program Description
This program will create one or more LWPolylines along the boundary of an LWPolyline with varying or constant width.
The core engine of the program consists of a function taking a single LWPolyline entity argument, and returning a list of resultant LWPolyline entities which describe the boundary of the supplied LWPolyline. I have included two calling functions: ' PolyOutline' for single selection, and 'mPolyOutline' allowing multiple selection of Polylines. These example commands will prompt the user for a selection of one or more LWPolylines and furthermore whether the selected objects should be deleted following creation of the boundary LWPolylines.
The resultant LWPolyline entities created by the function will inherit all properties (such as: layer, linetype, lineweight etc.) of each of the original selected objects.
The program is currently restricted to LWPolylines without arc segments or self-intersection.
PolyOutlineV1-1.lsp
|
Modificato da - arri in Data 07 settembre 2011 08:19:54
|
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
Inserito il - 13 febbraio 2012 : 13:03:19
|
alternativa di Terminator
(oltre a convertire, riempie con un Hatch)
(defun C:PL2CAN ()
(setvar "PEDITACCEPT" 1)
(setvar "CMDECHO" 1)
(setq gru(ssget '((0 . "LWPOLYLINE")))
index -1
modelspace(vla-get-Modelspace (vla-get-activedocument(vlax-get-acad-object)))
)
(setvar "HPNAME" "ANSI31")
(setvar "HPSCALE" 1)
(repeat (sslength gru)
(setq spessore(vla-get-ConstantWidth (vlax-ename->vla-object (ssname gru (setq index(1+ index))))))
(vla-put-ConstantWidth (vlax-ename->vla-object (ssname gru index)) 0.0)
(setq ent1(car(vlax-safearray->list (vlax-variant-value (vla-offset (vlax-ename->vla-object (ssname gru index)) (/ spessore 2))))))
(setq ent2(car(vlax-safearray->list (vlax-variant-value (vla-offset (vlax-ename->vla-object (ssname gru index)) (-(/ spessore 2)))))))
(setq coord1 (variant2lista (vla-get-coordinates ent1) 2))
(setq coord2 (variant2lista (vla-get-coordinates ent2) 2))
(cond
((eq (vla-get-Closed ent1) :vlax-true)
(vl-cmdf "_HATCH" "" "" "" (vlax-vla-object->ename ent1)(vlax-vla-object->ename ent2) "")
)
((eq (vla-get-Closed ent1) :vlax-false)
(vla-addLine modelspace (vlax-3d-point (car coord1))(vlax-3d-point (car coord2)))
(vl-cmdf "_PEDIT" (entlast) "_J" (vlax-vla-object->ename ent1)(vlax-vla-object->ename ent2) "" "_CL" "")
(vl-cmdf "_HATCH" "" "" "" (entlast) "")
)
)
)
)
;;; ***************************FUNZIONE VARIANT2LISTA*******************************
;;; Trasforma un variant in una lista a gruppi con numero elementi per gruppo
(defun variant2lista (listavariant numero / listaparz listafin)
(setq listaparz '()
listafin '()
)
(foreach elemento (vlax-safearray->list (vlax-variant-value listavariant))
(setq listaparz (append listaparz (list elemento)))
(if (= (length listaparz) numero)
(setq listafin (append listafin (list listaparz))
listaparz '()
)
)
)
listafin
)
P.S. |
Modificato da - arri in data 13 febbraio 2012 14:21:55 |
|
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 13 febbraio 2012 : 13:41:13
|
Ma non era di un certo confutatis???
Il tratteggio non è associativo, però, bisognerebbe usare gli ActiveX methods, ma, come disse lo stesso confutatis: "è troppo macchinoso". Vorrà dire che mi metterò in contatto con lui e lo scriviamo a 4 mani!! |
|
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 13 febbraio 2012 : 14:24:24
|
Dietro suggerimento di GP (che ringrazio), al posto di : (vl-cmdf "_HATCH" "" "" "" (entlast) "")
si sostituisce con: (vl-cmdf "_-HATCH" "_S" (entlast) "" "_A" "_A" "_Y" "" "")
In questo modo vengono fuori più opzioni fra cui l'associatività. Il tutto nasce dall'aver voluto usare a tutti i costi il multilingua con (vl-cmdf "_HATCH" ...), invece di (vl-cmdf "-TRATTEGGIO"...). Bastava eseguire: (vl-cmdf "_-HATCH"...) |
|
|
GP
Utente Master
Regione: Piemonte
Prov.: Vercelli
2776 Messaggi |
Inserito il - 13 febbraio 2012 : 18:59:42
|
La cosa incredibile è che Termitatis ottiene lo stesso risultato di LeeMac (che non è un pirla) in metà delle righe di codice.
Un mio amico mi scuserà se per una volta gli prendo in prestito un'immagine:
|
|
|
Giuseppe Mauro
Amministratore
Regione: Campania
Prov.: Napoli
2705 Messaggi |
Inserito il - 13 febbraio 2012 : 22:52:39
|
| Messaggio inserito da GP
La cosa incredibile è che Termitatis ottiene lo stesso risultato di LeeMac (che non è un pirla) in metà delle righe di codice.
|
Eh cari amici, la classe non e' acqua. E terminator ha stoffa da vendere... |
|
|
GP
Utente Master
Regione: Piemonte
Prov.: Vercelli
2776 Messaggi |
Inserito il - 13 febbraio 2012 : 23:59:46
|
Messaggio inserito da Giuseppe Mauro ...terminator ha stoffa da vendere...
...col suo Morini targato "Isonzo" mentre torna al pc per scrivere un lisp a cantacad.
|
|
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 14 febbraio 2012 : 06:15:56
|
Unica differenza la bici al posto del motorino, per il resto uguale!
|
|
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 14 febbraio 2012 : 08:57:53
|
Giusto un piccolo ritocco al codice:
(defun C:PL2CAN (/ gru index modelspace spessore ent1 ent2 coord1 coord2)
(setvar "PEDITACCEPT" 1)
(setvar "CMDECHO" 0)
(setq gru(ssget '((0 . "LWPOLYLINE")))
index -1
modelspace(vla-get-Modelspace (vla-get-activedocument(vlax-get-acad-object)))
)
(repeat (sslength gru)
(setq spessore(vla-get-ConstantWidth (vlax-ename->vla-object (ssname gru (setq index(1+ index))))))
(vla-put-ConstantWidth (vlax-ename->vla-object (ssname gru index)) 0.0)
(setq ent1(car(vlax-safearray->list (vlax-variant-value (vla-offset (vlax-ename->vla-object (ssname gru index)) (/ spessore 2)))))
ent2(car(vlax-safearray->list (vlax-variant-value (vla-offset (vlax-ename->vla-object (ssname gru index)) (-(/ spessore 2))))))
coord1 (variant2lista (vla-get-coordinates ent1) 2)
coord2 (variant2lista (vla-get-coordinates ent2) 2)
)
(cond
((eq (vla-get-Closed ent1) :vlax-true)
(vl-cmdf "_-HATCH" "P" "ANSI31" 2.0 0 "_S" (vlax-vla-object->ename ent1)(vlax-vla-object->ename ent2) "" "_A" "_A" "_Y" "" "")
)
((eq (vla-get-Closed ent1) :vlax-false)
(vla-addLine modelspace (vlax-3d-point (car coord1))(vlax-3d-point (car coord2)))
(vl-cmdf "_PEDIT" (entlast) "_J" (vlax-vla-object->ename ent1)(vlax-vla-object->ename ent2) "" "_CL" "")
(vl-cmdf "_-HATCH" "P" "ANSI31" 2.0 0 "_S" (entlast) "" "_A" "_A" "_Y" "" "")
)
)
)
)
;;; ***************************FUNZIONE VARIANT2LISTA*******************************
;;; Trasforma un variant in una lista a gruppi con numero elementi per gruppo
(defun variant2lista (listavariant numero / listaparz listafin)
(setq listaparz '()
listafin '()
)
(foreach elemento (vlax-safearray->list (vlax-variant-value listavariant))
(setq listaparz (append listaparz (list elemento)))
(if (= (length listaparz) numero)
(setq listafin (append listafin (list listaparz))
listaparz '()
)
)
)
listafin
)
Per sfizio, per curiosità e spulciando in rete ho provato ad usare il "metodo macchinoso" di aggiunta degli hatch. Questo è il risultato:
(defun C:PL2CAN2 (/ gru index modelspace spessore ent1 ent2 coord1 coord2 nuovapoli gruppo)
(setvar "PEDITACCEPT" 1)
(setvar "CMDECHO" 0)
(setq gru(ssget '((0 . "LWPOLYLINE")))
index -1
modelspace(vla-get-Modelspace (vla-get-activedocument(vlax-get-acad-object)))
)
(repeat (sslength gru)
(setq spessore(vla-get-ConstantWidth (vlax-ename->vla-object (ssname gru (setq index(1+ index))))))
(vla-put-ConstantWidth (vlax-ename->vla-object (ssname gru index)) 0.0)
(setq ent1(car(vlax-safearray->list (vlax-variant-value (vla-offset (vlax-ename->vla-object (ssname gru index)) (/ spessore 2)))))
ent2(car(vlax-safearray->list (vlax-variant-value (vla-offset (vlax-ename->vla-object (ssname gru index)) (-(/ spessore 2))))))
coord1 (variant2lista (vla-get-coordinates ent1) 2)
coord2 (variant2lista (vla-get-coordinates ent2) 2)
)
(cond
((eq (vla-get-Closed ent1) :vlax-true)
(setq hatch (vla-addhatch modelspace acHatchPatternTypePredefined "ANSI31" :vlax-true))
(setq gruppo (vlax-make-safearray vlax-vbobject '(0 . 0)))
(vla-appendouterloop hatch (vlax-safearray-fill gruppo (list ent1)))
(vla-appendinnerloop hatch (vlax-safearray-fill gruppo (list ent2)))
(vla-put-patternscale hatch 2.0)
(vla-evaluate hatch)
(vla-update hatch)
;;;(vl-cmdf "_-HATCH" "P" "ANSI31" 2.0 0 "_S" (vlax-vla-object->ename ent1)(vlax-vla-object->ename ent2) "" "_A" "_A" "_Y" "" "")
)
((eq (vla-get-Closed ent1) :vlax-false)
(vla-addLine modelspace (vlax-3d-point (car coord1))(vlax-3d-point (car coord2)))
(vl-cmdf "_PEDIT" (entlast) "_J" (vlax-vla-object->ename ent1)(vlax-vla-object->ename ent2) "" "_CL" "")
(setq nuovapoli(entlast))
(setq hatch (vla-addhatch modelspace acHatchPatternTypePredefined "ANSI31" :vlax-true))
(setq gruppo (vlax-make-safearray vlax-vbobject '(0 . 0)))
(vla-appendouterloop hatch (vlax-safearray-fill gruppo (list (vlax-ename->vla-object nuovapoli))))
(vla-put-patternscale hatch 2.0)
(vla-evaluate hatch)
(vla-update hatch)
;;;(vl-cmdf "_-HATCH" "P" "ANSI31" 2.0 0 "_S" (entlast) "" "_A" "_A" "_Y" "" "")
)
)
)
)
;;; ***************************FUNZIONE VARIANT2LISTA*******************************
;;; Trasforma un variant in una lista a gruppi con numero elementi per gruppo
(defun variant2lista (listavariant numero / listaparz listafin)
(setq listaparz '()
listafin '()
)
(foreach elemento (vlax-safearray->list (vlax-variant-value listavariant))
(setq listaparz (append listaparz (list elemento)))
(if (= (length listaparz) numero)
(setq listafin (append listafin (list listaparz))
listaparz '()
)
)
)
listafin
)
Sette righe in più invece di una... In sostanza viene creato un hatch che fisicamente non esiste come entità e di seguito vengono fissati i suoi contorni. Solo allora diventa visibile. Avviene praticamente l'operazione inversa di quella che avviene normalmente quando viene creato un hatch. Il tutto cercando di usare il meno possibile la funzione (command). Stavolta però mi sembra chiaro cosa è preferibile usare... |
Modificato da - Terminator in data 14 febbraio 2012 08:59:40 |
|
|
aforza
Utente Master
Regione: Italia
Prov.: Padova
Città: Cavarzere(VE)-Monselice(PD)
1798 Messaggi |
Inserito il - 14 febbraio 2012 : 11:42:33
|
Ciao,
mi associo e mi complimento...
Ciao |
Andrea Forza
CadWorx 2014 & Plant3D AutoCAD 2014 su Seven 64bit - Dell Vostro i7 ram 8gb - doppio monitor Hanns-g 22" |
|
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 14 febbraio 2012 : 16:34:54
|
Ringrazio per i complimenti!
Mi sono chiesto, perché non facciamo in modo che le polilinee si aggiornino automaticamente, quando modificate, una volta trasformate con i due offset? Così ho esplorato la parte dei reattori e sono riuscito ad ottenere questo. Il comando si chiama PL2CAN2. L'altro file PL2CAN3 viene caricato solo nella sessione corrente.
Scarica allegato:
pl2can.zip 2,4 KB |
|
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
|
|
Discussione |
|