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

Nota: Devi essere registrato per poter inserire un messaggio.
Per registrarti, clicca qui. La Registrazione è semplice e gratuita!

Larghezza finestra:
Nome Utente:
Password:
Modo:
Formato: GrassettoCorsivoSottolineatoBarrato Aggiungi Spoiler Allinea a  SinistraCentraAllinea a Destra Riga Orizzontale Inserisci linkInserisci EmailInserisci FlashInserisci Immagine Inserisci CodiceInserisci CitazioneInserisci Lista
   
Icona Messaggio:              
             
Messaggio:

  * Il codice HTML è OFF
* Il Codice Forum è ON

Faccine
Felice [:)] Davvero Felice [:D] Caldo [8D] Imbarazzato [:I]
Goloso [:P] Diavoletto [):] Occhiolino [;)] Clown [:o)]
Occhio Nero [B)] Palla Otto [8] Infelice [:(] Compiaciuto [8)]
Scioccato [:0] Arrabbiato [:(!] Morto [xx(] Assonnato [|)]
Bacio [:X] Approvazione [^] Disapprovazione [V] Domanda [?]
Seleziona altre faccine

    
 
   

V I S U A L I Z Z A    D I S C U S S I O N E
arri 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
11   U L T I M E    R I S P O S T E    (in alto le più recenti)
arri Inserito il - 13 febbraio 2013 : 14:50:59
Advanced Polyline Outline
Terminator 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
aforza Inserito il - 14 febbraio 2012 : 11:42:33
Ciao,

mi associo e mi complimento...

Ciao
Terminator 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...
Terminator Inserito il - 14 febbraio 2012 : 06:15:56
Unica differenza la bici al posto del motorino, per il resto uguale!
GP 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.
Giuseppe Mauro 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 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:




Terminator 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"...)
Terminator 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!!
arri 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.

TuttoCAD Forum © 2001-2010 CADLandia Torna all'inizio della Pagina
Pagina generata in 0,21 secondi.