TuttoCAD Forum

TuttoCAD Forum
[ Home | Registrati | Discussioni Attive | Discussioni Recenti | Segnalibro | Msg privati | Sondaggi Attivi | Utenti | Album Fotografico | Download | | Cerca | FAQ ]
Nome Utente:
Password:
Salva Password
Password Dimenticata?

 Tutti i Forum
 1 - TuttoCAD Software
 AutoLISP
 Polyline Outline
 Nuova Discussione  Rispondi
 Versione Stampabile Bookmark this Topic Aggiungi Segnalibro
I seguenti utenti stanno leggendo questo Forum Qui c'è:
Autore Discussione Precedente Discussione Discussione Successiva  

arri
Utente Master


Regione: Lombardia


14951 Messaggi

Inserito il - 05 settembre 2011 : 09:14:32  Mostra Profilo Invia a arri un Messaggio Privato  Rispondi Quotando
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  Mostra Profilo Invia a arri un Messaggio Privato  Rispondi Quotando
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
Torna all'inizio della Pagina

Terminator
Utente Master



725 Messaggi

Inserito il - 13 febbraio 2012 : 13:41:13  Mostra Profilo Invia a Terminator un Messaggio Privato  Rispondi Quotando
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!!
Torna all'inizio della Pagina

Terminator
Utente Master



725 Messaggi

Inserito il - 13 febbraio 2012 : 14:24:24  Mostra Profilo Invia a Terminator un Messaggio Privato  Rispondi Quotando
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"...)
Torna all'inizio della Pagina

GP
Utente Master


Regione: Piemonte
Prov.: Vercelli


2776 Messaggi

Inserito il - 13 febbraio 2012 : 18:59:42  Mostra Profilo Invia a GP un Messaggio Privato  Rispondi Quotando
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:




Torna all'inizio della Pagina

Giuseppe Mauro
Amministratore



Regione: Campania
Prov.: Napoli


2703 Messaggi

Inserito il - 13 febbraio 2012 : 22:52:39  Mostra Profilo Invia a Giuseppe Mauro un Messaggio Privato  Rispondi Quotando
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...
Torna all'inizio della Pagina

GP
Utente Master


Regione: Piemonte
Prov.: Vercelli


2776 Messaggi

Inserito il - 13 febbraio 2012 : 23:59:46  Mostra Profilo Invia a GP un Messaggio Privato  Rispondi Quotando
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.
Torna all'inizio della Pagina

Terminator
Utente Master



725 Messaggi

Inserito il - 14 febbraio 2012 : 06:15:56  Mostra Profilo Invia a Terminator un Messaggio Privato  Rispondi Quotando
Unica differenza la bici al posto del motorino, per il resto uguale!
Torna all'inizio della Pagina

Terminator
Utente Master



725 Messaggi

Inserito il - 14 febbraio 2012 : 08:57:53  Mostra Profilo Invia a Terminator un Messaggio Privato  Rispondi Quotando
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
Torna all'inizio della Pagina

aforza
Utente Master


Regione: Italia
Prov.: Padova
Città: Cavarzere(VE)-Monselice(PD)


1798 Messaggi

Inserito il - 14 febbraio 2012 : 11:42:33  Mostra Profilo  Rispondi Quotando
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"
Torna all'inizio della Pagina

Terminator
Utente Master



725 Messaggi

Inserito il - 14 febbraio 2012 : 16:34:54  Mostra Profilo Invia a Terminator un Messaggio Privato  Rispondi Quotando
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
Torna all'inizio della Pagina

arri
Utente Master


Regione: Lombardia


14951 Messaggi

Inserito il - 13 febbraio 2013 : 14:50:59  Mostra Profilo Invia a arri un Messaggio Privato  Rispondi Quotando
Advanced Polyline Outline
Torna all'inizio della Pagina
  Discussione Precedente Discussione Discussione Successiva  
 Nuova Discussione  Rispondi
 Versione Stampabile Bookmark this Topic Aggiungi Segnalibro
Vai a:
TuttoCAD Forum © 2001-2010 CADLandia Torna all'inizio della Pagina
Pagina generata in 0,35 secondi.