Aller au contenu

Messages recommandés

Posté(e)

hello

je cherche à décomposer une ligne

j'ai une ligne (en l'occurrence un spline) qui est sur le style de trait zigzag

je vais pas refaire une speech sur les inconvénients de ce type de ligne mais je souhaiterai savoir si il est possible de décomposer une spline en x ligne à une échelle donnée?

je ne crois pas avoir vu de tels lisps mais j'ai peut être mal cherché.

merci pour vos lumières

Phil

PS : l'idéal serait même de convertir ces mulmtitudes de lignes en une plyligne pour pouvoir l'effacer plus rapidement pour le cas ou on aurait à faire des modifications sur l'objet (qui serait pour le coup inmodifiable - ou presque)

Projeteur Revit Indépendant - traitement des eaux/CVC

Posté(e)

Salut,

 

Ça commence à faire quelques versions (au moins 2013) qu'il existe une commande native pour convertir les splines en polylignes : EDITSPLINE (_SPLINEDIT) option : convertir en Polyligne (voir aussi les variables PLINECONVERTMODE et DELOBJ). Cette commande est aussi accessible via le menu contextuel des splines.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Re,

 

En fait les méthodes .NET Spline.ToPolyline(), Spline.ToPolyline(uint numOfVertices) et Spline.ToPolylineWithPrecision(int precision) sont arrivées avec la version 2010, on peut donc raisonnablement penser que cette option de la commande EDITSPLINE existe au moins depuis cette version.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

hello

le problème n'est pas tant la conversion de la SPL en PL (ça fait déjà qqs temps que j'ai un lisp pour cette manip) mais ce que je souhaiterai c'est convertir cette SPL (ou PL convertie) sur le style de ligne zigzag en une autre polyligne qui serait composé de très nombreuses lignes si on venait à la décomposer

le gros problème sur les styles de lignes de ce type là c'est que l'affichage varie en fonction de l'échelle à laquelle on imprime.

ça rend bien à une échelle et c'est tout pourri à une autre or mon zigzag représente les parois extérieures d'une flexible

une petite image de l'objet que j'ai actuellement (et que je souhaite invariable suivant les échelles)

http://img15.hostingpics.net/thumbs/mini_905655flexible.png

j'espère que ça sera plus clair pour vous tous

Phil

Projeteur Revit Indépendant - traitement des eaux/CVC

Posté(e)

Ce que tu souhaites faire: Décomposer un type de ligne en ligne, n'est pas possible.

 

La seule solution que je percois (et qui n'est pas très pratique) est de faire une sortie traceur en fichier DXB (installer le pilote si celui-ci n'a jamais été utilisé).

 

Une fois l'impression effectuée (avec les bons réglages) réimporter celui-ci avec la commande _DXBIN.

 

A partir de là tu auras effectivement des lignes décomposées de ta représentation de type de ligne.

 

Procédure fastidieuse, mais seul moyen pour obtenir ce résultat.

 

Autrement dessiner le flexible avec un lisp. J'avais récupéré un lisp qui faisait cela, je te le met en ligne si ça peut le faire pour toi.

 

;;;=======================[ FlexDuct.lsp ]==============================
;;; Author: Copyright© 2007 Charles Alan Butler 
;;; Contact or Updates  @  www.TheSwamp.org
;;; Version:  1.3   October 6,2007
;;; Purpose: Create Flex Duct from a centerline that the user picks
;;;    Centerline may be anything vla-curve will handle
;;; Sub_Routines:      
;;;    makePline which creates a LW Polyline
;;; Restrictions: UCS is supported
;;;    No layer support at this time
;;;    No error handler at this time
;;; Known Issues:
;;;    Tight curves cause the pline jacket to cross over
;;; Returns:  none
;;;=====================================================================
;;;   THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED     ;
;;;   WARRANTY.  ALL IMPLIED WARRANTIES OF FITNESS FOR ANY PARTICULAR  ;
;;;   PURPOSE AND OF MERCHANTABILITY ARE HEREBY DISCLAIMED.            ;
;;;                                                                    ;
;;;  You are hereby granted permission to use, copy and modify this    ;
;;;  software without charge, provided you do so exclusively for       ;
;;;  your own use or for use by others in your organization in the     ;
;;;  performance of their normal duties, and provided further that     ;
;;;  the above copyright notice appears in all copies and both that    ;
;;;  copyright notice and the limited warranty and restricted rights   ;
;;;  notice below appear in all supporting documentation.              ;
;;;=====================================================================

(defun c:Flex (/          cl-ent     ribWidth   RibShort   RibLong
              collar     dist       steps      ribFlag    pt
              curAng     curDer     RibPtLst1  RibPtLst2  p1
              p2         doc        space      cflag      cl-len
              ribRadius  tmp        NewPline   FlexLayer  NewPtlst1
              NewPtlst2  InsulThick
             )
 (vl-load-com)
 (setq Doc (vla-get-activedocument (vlax-get-acad-object)))
 (vla-endundomark doc)
 (vla-startundomark doc)

 (setq Flexlayer "0") ; put your Duct layer here
 (setq InsulThick 0) ; to be added to duct diameter, use 2 for 1" insulation

 ;;   --------   Local Functions   ---------

 ;;  Expects pts to be a list of 2D or 3D points
 (defun makePline (spc pts)
   (if (= (length (car pts)) 2) ; 2d point list
     (setq pts (apply 'append pts))
     (setq
       pts (apply 'append (mapcar '(lambda (x) (list (car x) (cadr x))) pts))
     )
   )
   (setq
     pts (vlax-make-variant
           (vlax-safearray-fill
             (vlax-make-safearray vlax-vbdouble (cons 0 (1- (length pts))))
             pts
           )
         )
   )
   (vla-addlightweightpolyline spc pts)
 )
 ;;   -------------------------------------


 ;;  Get the Duct Diameter, global variable
 (or duct:dia (setq duct:dia 16.0)) ; default value

 (while            ; Main Loop
   (progn
     (prompt (strcat "\nDuct diameter is set to "
                     (vl-princ-to-string duct:dia)))
     (setvar "errno" 0) ; must pre set the errno to 0 
     (initget "Diametre _Diameter")
     (setq cl-ent
            (entsel "\nSelect center of flex duct.[Diameter] Enter to quit.")
     )

     (cond
       ((= (getvar "errno") 52) ; exit if user pressed ENTER
        nil        ; exit loop
       )
       ((= cl-ent "Diameter")
        (initget (+ 2 4))
        (setq
          tmp (getdist
                (strcat "\nSpecify duct diameter <" (rtos duct:dia) ">: ")
              )
        )
        (and tmp (setq duct:dia tmp))
        t          ; stay in loop
       )

       ((not (null cl-ent))
        ;;  check entity before making the duct
        (if (not (vl-catch-all-error-p
                   (setq tmp (vl-catch-all-apply
                               'vlax-curve-getpointatparam
                               (list (car cl-ent) 0.0)
                             )
                   )
                 )
            )
          (progn   ; OK to make duct
            (setq cl-ent   (car cl-ent) ; Center Line
                  ribWidth (* duct:dia 0.167)
                  RibShort (+ duct:dia InsulThick) ; add insulation
                  RibLong  (+ RibShort (* ribWidth 2))
            )

            ;;  centerline length
            (setq cl-len (vlax-curve-getdistatparam
                           cl-ent
                           (vlax-curve-getendparam cl-ent)
                         )
                  steps  (/ cl-len ribWidth)
            )
            (if (= (logand (fix steps) 1) 1) ; T = odd
              (setq steps (fix steps))
              (setq steps (1+ (fix steps)))
            )
            (setq ribWidth (/ (- cl-len 0.25) (1- steps))
                  collar   (* 3 ribWidth) ; collar at each end
                  dist     0.125 ; distance along center line
            )

            (setq ribFlag 0
                  cflag t
            )

            ;;  ----------   Create Rib End Points   -----------
            (repeat steps
              (setq pt (vlax-curve-getpointatdist cl-ent dist))
              (setq
                curDer (trans
                         (vlax-curve-getfirstderiv cl-ent
                           (vlax-curve-getparamatpoint cl-ent pt)
                         )
                         0 1
                       )
              )
              ;; Get angle 90 deg to curve
              (setq curAng (+ (/ pi 2) (angle '(0 0) curDer)))
              (setq ribRadius (if (zerop ribFlag) (/ RibShort 2) (/ RibLong 2)))
              (setq pt (trans pt 0 1)) ; WCS > UCS
              (setq p1 (polar pt curAng ribRadius))
              (setq p2 (polar pt (+ pi curAng) ribRadius))
              (if cflag ; create start collar points
                (setq RibPtLst1 (list (polar p1 (angle curDer '(0 0)) collar))
                      RibPtLst2 (list (polar p2 (angle curDer '(0 0)) collar))
                      cflag     nil
                )
              )
              (setq RibPtLst1 (cons p1 RibPtLst1))
              (setq RibPtLst2 (cons p2 RibPtLst2))

              (setq ribFlag (- 1 ribFlag)
                    dist    (+ ribWidth dist)
              )
            )
            ;;  create end collar points
            (setq RibPtLst1 (cons (polar p1 (angle '(0 0) curDer) collar)
                                  RibPtLst1)
                  RibPtLst2 (cons (polar p2 (angle '(0 0) curDer) collar)
                                  RibPtLst2)
            )

            ;;  rearrange point lists
            (setq idx 0
                  NewPtlst1 nil
                  NewPtlst2 nil
            )
            (repeat (1- (length RibPtLst1))
              (if (= (logand idx 1) 1) ; T = odd
                (setq NewPtlst1 (cons (nth idx RibPtLst2) NewPtlst1)
                      NewPtlst1 (cons (nth (1+ idx) RibPtLst2) NewPtlst1)
                      NewPtlst2 (cons (nth idx RibPtLst1) NewPtlst2)
                      NewPtlst2 (cons (nth (1+ idx) RibPtLst1) NewPtlst2)
                )
                (setq NewPtlst1 (cons (nth idx RibPtLst1) NewPtlst1)
                      NewPtlst1 (cons (nth (1+ idx) RibPtLst1) NewPtlst1)
                      NewPtlst2 (cons (nth idx RibPtLst2) NewPtlst2)
                      NewPtlst2 (cons (nth (1+ idx) RibPtLst2) NewPtlst2)
                )
              )
              (setq idx (1+ idx))
            )

            ;;  --------   point list to WCS   ------------
            (setq NewPtlst1 (mapcar '(lambda (x) (trans x 1 0)) NewPtlst1))
            (setq NewPtlst2 (mapcar '(lambda (x) (trans x 1 0)) NewPtlst2))

            ;;  --------   create jacket plines   ------------
            (or space
                (setq space
                       (if (zerop (vla-get-activespace doc))
                         (if (= (vla-get-mspace doc) :vlax-true)
                           (vla-get-modelspace doc) ; active VP
                           (vla-get-paperspace doc)
                         )
                         (vla-get-modelspace doc)
                       )
                )
            )

            (setq newpline (makePline space NewPtlst1))
            (vla-put-layer newpline Flexlayer)
            ;;(vla-put-elevation newpline z)

            (setq newpline (makePline space NewPtlst2))
            (vla-put-layer newpline Flexlayer)
            ;;(vla-put-elevation newpline z)
          ) ; progn
          (princ "\nError - Can not use that object, Try again.")
        ) ; endif
        t
       )
       (t (princ "\nMissed Try again."))
     )             ; cond stmt
   )               ; progn
 )                 ; while
 (vla-endundomark doc)
 (vlax-release-object space)
 (vlax-release-object doc)
 ;;-----------  E N D   O F   L I S P  ----------------------------
 (princ)
)
(prompt "\nFlex Duct loaded, Enter FLEX to run.")
(princ)

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Salut,

 

le gros problème sur les styles de lignes de ce type là c'est que l'affichage varie en fonction de l'échelle à laquelle on imprime.

ça rend bien à une échelle et c'est tout pourri à une autre or mon zigzag représente les parois extérieures d'une flexible

 

Je pense, comme Bryce, que la variable PSLTSCALE sert précisément à ça, par contre, je dirais qu'il faut la mettre à 1. Il faut, bien sûr, régler LTSCALE pour avoir un affichage correct en espace papier (mm par défaut) et régénérer chaque fenêtre.

psltscale.png

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • 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é