Aller au contenu

PLINEs --> Sinusoidales


lecrabe

Messages recommandés

 

Hello

 

J'ai trouve ce Lisp (qui marche sur theswamp) qui dessine une belle sinusoidale

en cliquant sur N points ! :)

Donc il faut "suivre a la main" une Pline existante !? :o

 

Mais je desire plutot pouvoir selectionner N Plines (closes ou non) et dessiner par dessus en Pline sur le calque courant de belles sinusoidales

avec peut etre une question relative au rayon/envergure de la sinusoidale !

On passe toujours par les vertex donc si il y a des arcs (on s'en fout)

de meme si elle est splinee ou lisse ...

 

Merci d'avance, Le Decapode

 

Code en provenance de theswamp :

http://www.theswamp.org/index.php?topic=32289.0

 

 


;; http://www.theswamp.org/index.php?topic=32289.0
;; Draw a Wave from a Pline

(defun c:WavePline (/ DivideDistance EntList Blg Pt nPt cnt Dist Sc )
   
   (defun DivideDistance ( sPt ePt dist / Ang tempDist SpDist Amnt )
       
       (setq Ang (angle sPt ePt))
       (setq tempDist (distance sPt ePt))
       (setq SpDist (/ tempDist (setq Amnt (fix (/ tempDist dist)))))
       (setq Amnt (1+ Amnt))
       (setq cnt (+ Amnt cnt))
       (repeat Amnt
           (setq EntList
               (cons
                   (cons 42 (setq Blg (- Blg)))
                   (cons
                       (cons 41 0.)
                       (cons
                           (cons 40 0.)
                           (cons
                               (cons 10 (list (car sPt) (cadr sPt)))
                               EntList
                           )
                       )
                   )
               )
           )
           (setq sPt (polar sPt Ang SpDist))
       )
       EntList
   )
   ;-------------------------------------------------
   (setq Dist 0.4)
   (setq Sc (getvar 'LtScale))
   (setq EntList
       (list
           (cons 90 2)
           (cons 100 "AcDbPolyline")
           (cons 100 "AcDbEntity")
           (cons 0 "LWPOLYLINE")
       )
   )
   (setq Blg 1.)
   (setq cnt 0)
   (if (setq Pt (getpoint "\n Select first point: "))
       (progn
           (while (setq nPt (getpoint Pt "\n Select next point: "))
               (setq EntList (DivideDistance Pt nPt (* Dist Sc)))
               (setq Pt nPt)
               (setq cnt (1+ cnt))
           )
           (entmake (subst (cons 90 cnt) '(90 . 2) (reverse EntList)))
       )
   )
   (princ)
)

 

 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

rajouter la fonction

 

(defun getPolySegs (ent / entl p1 pt bulge seg ptlst)
 (cond (ent
        (setq entl (entget ent))
        ;; save start point if polyline is closed
        (if (= (logand (cdr (assoc 70 entl)) 1) 1)
          (setq p1 (cdr (assoc 10 entl)))
        )
        ;; run thru entity list to collect list of segments
        (while (setq entl (member (assoc 10 entl) entl))
          ;; if segment then add to list
          (if (and pt bulge)
            (setq seg (list pt bulge))
          )
          ;; save next point and bulge
          (setq pt    (cdr (assoc 10 entl))
                bulge (cdr (assoc 42 entl))
          )
          ;; if segment is build then add last point to segment
          ;; and add segment to list
          (if seg
            (setq seg (append seg (list pt))
                  ptlst (cons seg ptlst))
          )
          ;; reduce list and clear temporary segment
          (setq entl  (cdr entl)
                seg   nil
          )
        )
       )
 )
 ;; if polyline is closed then add closing segment to list
 (if p1 (setq ptlst (cons (list pt bulge p1) ptlst)))
 ;; reverse and return list of segments
 (reverse ptlst)
) 

 

qui ne marche cependant pas pour les polylignes splinées.

 

Et changer la fin du lisp WavePline en quelque chose du style :

 

    (setq Blg 1.)
   (setq cnt 0)
   (setq pl (car (entsel)))
   (setq lseg (getpolysegs pl))
   (foreach seg lseg
     (setq EntList (DivideDistance (car seg) (caddr seg) (* Dist Sc)))
     (setq cnt (1+ cnt))
   )
   (entmake (subst (cons 90 cnt) '(90 . 2) (reverse EntList)))
   (princ)

 

Amicalement

Vincent

 

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Lien vers le commentaire
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité