Aller au contenu

Messages recommandés

Posté(e)

Bonjour,

 

J'ai une instruction en vlax qui me bloque !?!? :mad:

 

voici les 2 expressions équivalentes qui me retournent le vecteur d'extrusion d'un objet.

 

(cdr(assoc 210 (entget(car(entsel))))) 

 

(vlax-get (vlax-ename->vla-object (car(entsel))) 'Normal) 

 

Dans mon développement, j'utilise la seconde syntaxe mais elle refuse de fonctionner pour les SPLINE.

 

Choix de l'objet: ; erreur: Le serveur ActiveX a renvoyé l'erreur: nom inconnu: "NORMAL"

 

Une solution à part l'utilisation du code Dxf? La Spline requiert une autre syntaxe pour obtenir la normale de l'objet?

 

Voilà la question que je me pose.

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

Posté(e)

Salut bonuscad,

 

en faisant dump-object on obtient ceci

 

Commande: (vlax-dump-object (vlax-ename->vla-object (car(entsel))))

 

Choix de l'objet: ; IAcadSpline: Interface AutoCAD Spline

; Valeurs de propriétés:

; Application (RO) = #

; Area (RO) = 887091.0

; Closed (RO) = 0

; ControlPoints = (939.867 1042.34 0.0 1081.99 1186.51 0.0 ... )

; Degree (RO) = 3

; Document (RO) = #

; EndTangent = (0.0 0.0 0.0)

; FitPoints = (939.867 1042.34 0.0 1431.09 1377.36 0.0 ... )

; FitTolerance = 1.0e-010

; Handle (RO) = "117"

; HasExtensionDictionary (RO) = 0

; Hyperlinks (RO) = #

; IsPeriodic (RO) = 0

; IsPlanar (RO) = -1

; IsRational (RO) = 0

; Knots = (0.0 0.0 0.0 0.0 594.591 1591.33 ... )

; Layer = "0"

; Linetype = "ByLayer"

; LinetypeScale = 1.0

; Lineweight = -1

; Material = "ByLayer"

; NumberOfControlPoints (RO) = 6

; NumberOfFitPoints (RO) = 4

; ObjectID (RO) = 2130264184

; ObjectName (RO) = "AcDbSpline"

; OwnerID (RO) = 2130259192

; PlotStyleName = "ByLayer"

; StartTangent = (0.0 0.0 0.0)

; TrueColor = #

; Visible = -1

; Weights = AutoCAD.Application: Aucune épaisseur disponible pour la spline

polynomiale

 

Et comme le serveur ActiveX l'annonce, il n'y a pas de paramètre "Normal".

 

Soit, il se calcule avec d'autres paramètres, soit utilise plutôt le DXF 210.

Tous pour lisp, Lisp pour tous!

Avec Revit, cela ne vas trop vite...

Posté(e)

Salut,

 

C'est normal ;)

 

Une spline peut être plane ou non (CF vla-get-IsPlanar ou code binaire 8 du groupe 70).

Et si elle n'est pas plane, elle ne peut avoir de normale.

D'ailleurs si le groupe 70 ne contient pas le code binaire 8, le groupe 210 n'existe pas.

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

Posté(e)

Merci (gile), tes explications m'ont bien éclairé :)

 

C'est vrai que j'ai testé le code que sur une Spline plane et je ne m'expliquais pas cette différence de retour entre (entget) et (vla-get).

 

Il me reste un petit souci.

Voici le code complet (presque abouti, qui deviendra peut-être par la suite une sous-fonction d'un autre projet).

 

Je suis pas satisfait du résultat d'une spline plane, mais construite dans un Scu non-parallèle.

Je n'ai pas encore testée toute les situations avec différentes Splines.

 

(defun l-coor2l-pt (lst flag / )
 (if lst
   (cons (list (car lst) (cadr lst) (if flag (caddr lst) 0.0))
     (l-coor2l-pt (if flag (cdddr lst) (cddr lst)) flag)
   )
 )
)
(vl-load-com)
(defun c:my_project ( / jspl nbr n AcDoc Space ucs_current ucs_world
      ent_name indx l_blg l_pt ename id_obj pl_typ index nw_pl)
(setq
 jspl
  (ssget
   '((-4 . "     (-4 . "      (0 . "POLYLINE")
     (-4 . "       (-4 . "&") (70 . 112)
     (-4 . "NOT>")
    (-4 . "AND>")
    (0 . "LWPOLYLINE,LINE,SPLINE,ARC,CIRCLE,ELLIPSE")
   (-4 . "OR>"))
  )
 nbr -1
 n 0
)
(cond
 (jspl
  (setq
   AcDoc (vla-get-ActiveDocument (vlax-get-acad-object))
   Space
   (if (eq (getvar "CVPORT") 1)
    (vla-get-PaperSpace AcDoc)
    (vla-get-ModelSpace AcDoc)
   )
  )
  (vla-StartUndoMark AcDoc)
  (setq
   ucs_current
   (vla-add
    (vla-get-UserCoordinateSystems AcDoc)
    (vlax-3d-point (setq org (getvar "UCSORG")))
    (vlax-3d-point (mapcar '+ org (getvar "UCSXDIR")))
    (vlax-3d-point (mapcar '+ org (getvar "UCSYDIR")))
    "Current_UCS"
   )
   ucs_world
   (vla-add
    (vla-get-UserCoordinateSystems AcDoc)
    (vlax-3d-point (setq org '(0.0 0.0 0.0)))
    (vlax-3d-point (mapcar '+ org '(1.0 0.0 0.0)))
    (vlax-3d-point (mapcar '+ org '(0.0 1.0 0.0)))
    "World-WCS"
   )
  )
  (vla-put-activeUCS AcDoc ucs_world)
  (repeat (sslength jspl)
   (setq
    ent_name (ssname jspl (setq nbr (1+ nbr)))
    indx -1
    l_blg nil
    l_pt nil
    ename (vlax-ename->vla-object ent_name)
    id_obj (vla-get-ObjectName ename)
   )
   (cond
    ((member id_obj '("AcDbPolyline" "AcDb2dPolyline" "AcDb3dPolyline"))
     (setq pl_typ
      (if (vlax-property-available-p ename 'Type)
       (vlax-get ename 'Type)
      )
     )
     (if (member id_obj '("AcDbPolyline" "AcDb2dPolyline"))
      (if (not (equal (vlax-get ename 'Normal) '(0.0 0.0 1.0) 1E-13))
       (progn
        (repeat (fix (vlax-curve-getEndParam ename))
         (setq l_pt
          (cons
           (vlax-curve-GetPointAtParam ename
            (setq indx (1+ indx))
           )
           l_pt
          )
          index (float indx)
         )
         (if
          (or
           (eq pl_typ 1)
           (if (< pl_typ 3) (not (zerop (vla-GetBulge ename indx))))
          )
          (while (eq indx (fix (+ 0.01 index)))
           (setq l_pt
            (cons
             (vlax-curve-GetPointAtParam
              ename
              (setq index (+ 0.01 index))
             )
             l_pt
            )
           )
          )
         )
        )
        (setq l_pt (cons (vlax-curve-getEndPoint ename) l_pt))
       )
       (setq l_pt
        (mapcar
         '(lambda (x)
          (trans
           (list
            (car x)
            (cadr x)
            (+
             (if (eq id_obj "AcDbPolyline") (caddr x) 0.0)
             (if (vlax-property-available-p ename 'Elevation)
              (vlax-get ename 'Elevation)
              0.0
             )
            )
           )
           ent_name
           0
          )
         )
         (l-coor2l-pt
          (vlax-get ename 'Coordinates)
          (eq id_obj "AcDb2dPolyline")
         )
        )
       )
      )
      (setq l_pt (l-coor2l-pt (vlax-get ename 'Coordinates) T))
     )
     (if (eq (vla-get-ObjectName ename) "AcDbPolyline")
      (setq nw_pl
       (vlax-invoke
        Space
        'AddLightWeightPolyline
        (apply
         'append
         (mapcar
          'list
          (mapcar 'car l_pt)
          (mapcar 'cadr l_pt)
         )
        )
       )
      )
      (setq nw_pl (vlax-invoke Space 'AddPolyline (apply 'append l_pt)))
     )
     (vla-put-Normal nw_pl (vlax-3d-point '(0 0 1)))
     (if (vlax-property-available-p ename 'Type)
      (progn
       (setq pl_typ
        (if (eq (vla-get-ObjectName ename) "AcDb3dPolyline")
         (if (zerop (vlax-get ename 'Type))
          (vlax-get ename 'Type)
          (1+ (vlax-get ename 'Type))
         )
         (vlax-get ename 'Type)
        )
       )
       (if
        (and
         (vlax-property-available-p ename 'Normal)
         (not (equal (vlax-get ename 'Normal) '(0.0 0.0 1.0) 1E-13))
         (eq pl_typ 1)
        )
        (vla-put-Type nw_pl 0)
        (vla-put-Type nw_pl pl_typ)
       )
      )
      (if
       (and
        (vlax-property-available-p ename 'Normal)
        (equal (vlax-get ename 'Normal) '(0 0 1) 1E-13)
       )
       (progn
        (repeat (length l_pt)
         (setq l_blg
          (cons
           (vla-GetBulge ename (setq indx (1+ indx)))
           l_blg
          )
         )
        )
        (foreach el l_blg
         (vla-SetBulge nw_pl indx el)
         (setq indx (1- indx))
        )
       )
      )
     )
     (vla-put-Closed nw_pl (vlax-get ename 'Closed))
    )
    ((member id_obj '("AcDbEllipse" "AcDbCircle" "AcDbArc"))
     (if (not (equal (vlax-get ename 'Normal) '(0.0 0.0 1.0) 1E-13))
      (progn
       (setq
        index (vlax-curve-getStartParam ename)
        l_pt (list (vlax-curve-GetPointAtParam ename index))
       )
       (while
        (<
         (setq index (+ 0.01 index))
         (vlax-curve-getEndParam ename)
        )
        (setq l_pt (cons (vlax-curve-GetPointAtParam ename index) l_pt))
       )
       (setq nw_pl
        (vlax-invoke Space
         'AddLightWeightPolyline
         (apply
          'append
          (mapcar 'list (mapcar 'car l_pt) (mapcar 'cadr l_pt))
         )
        )
       )
      )
      (cond
       ((eq id_obj "AcDbEllipse")
        (setq
         l_pt (vlax-get ename 'Center)
         nw_pl
         (vlax-invoke Space 'AddEllipse
          (list (car l_pt) (cadr l_pt) 0.0)
          (list
           (car (vlax-get ename 'MajorAxis))
           (cadr (vlax-get ename 'MajorAxis))
           0.0
          )
          (*
           (caddr (vlax-get ename 'Normal))
           (vlax-get ename 'RadiusRatio)
          )
         )
        )
        (vla-put-Normal nw_pl (vlax-3d-point '(0 0 1)))
        (vla-put-StartAngle nw_pl (vlax-get ename 'StartAngle))
        (vla-put-StartParameter nw_pl (vlax-get ename 'StartParameter))
        (vla-put-EndParameter nw_pl (vlax-get ename 'EndParameter))
       )
       ((or (eq id_obj "AcDbArc") (eq id_obj "AcDbCircle"))
        (setq
         l_pt (vlax-get ename 'Center)
         nw_pl
         (if (eq id_obj "AcDbArc")
          (vlax-invoke
           Space
           'AddArc
           (list (car l_pt) (cadr l_pt) 0.0)
           (vlax-get ename 'Radius)
           (vlax-get ename 'StartAngle)
           (vlax-get ename 'EndAngle)
          )
          (vlax-invoke
           Space
           'AddCircle
           (list (car l_pt) (cadr l_pt) 0.0)
           (vlax-get ename 'Radius)
          )
         )
        )
        (vla-put-Normal nw_pl (vlax-3d-point '(0 0 1)))
       )
      )
     )
    )
    ((eq id_obj "AcDbSpline")
     (setq l_pt
      (l-coor2l-pt
       (if (zerop (vlax-get ename 'NumberOfFitPoints))
        (cdddr
         (reverse
          (cdddr
           (reverse
            (vlax-get ename 'ControlPoints)
           )
          )
         )
        )
        (vlax-get ename 'FitPoints)
       )
       T
      )
      nw_pl
      (vlax-invoke Space
       'AddSpline
       (apply
        'append
        (mapcar
         '(lambda (x y)
          (list x y 0.0)
         )
         (mapcar 'car l_pt)
         (mapcar 'cadr l_pt)
        )
       )
       (list
        (car (vlax-curve-getFirstDeriv ename 0))
        (cadr (vlax-curve-getFirstDeriv ename 0))
        0.0
       )
       (list
        (car (vlax-curve-getFirstDeriv ename (vlax-curve-getEndParam ename)))
        (cadr (vlax-curve-getFirstDeriv ename (vlax-curve-getEndParam ename)))
        0.0
       )
      )
      l_pt (l-coor2l-pt (vlax-get ename 'ControlPoints) T)
     )
     (vla-put-ControlPoints nw_pl 
      (vlax-make-variant
       (vlax-safearray-fill
        (vlax-make-safearray
         vlax-vbDouble
         (cons 0 (1- (* (length l_pt) 3)))
        )
        (apply
         'append
         (mapcar
          '(lambda (x y)
           (list x y 0.0)
          )
          (mapcar 'car l_pt)
          (mapcar 'cadr l_pt)
         )
        )
       )
      )
     )
    )
    ((eq id_obj "AcDbLine")
     (setq
      nw_pl
      (vlax-invoke
       Space
       'AddLine
       (list
        (car (vlax-get ename 'StartPoint))
        (cadr (vlax-get ename 'StartPoint))
        0.0
       )
       (list
        (car (vlax-get ename 'EndPoint))
        (cadr (vlax-get ename 'EndPoint))
        0.0
       )
      )
     )
     (vla-put-Normal nw_pl (vlax-3d-point '(0 0 1)))
    )
   )
  )
  (and ucs_current (vla-put-activeUCS AcDoc ucs_current))
  (and ucs_world (vla-delete ucs_world))
  (vla-EndUndoMark AcDoc)
  (vlax-release-object Space)
  (vlax-release-object AcDoc)
  (princ
   (strcat
    "\n"
    (itoa (sslength jspl))
    " entité(s) soumises à la commande. TERMINE !"
   )
  )
 )
 (T (princ "\nPas d'entités conformes sélectionnées..!"))
)
(prin1)
)

 

D'autres commentaires, suggestions sont les bienvenues.

 

 

[Edité le 10/11/2009 par bonuscad]

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

Posté(e)

Salut,

 

J'ai fait quelques tests avec des courbes sur des SCU non parallèles au SCG.

Je n'ai pas eu de soucis avec les spline mais avec les cercles arcs et ellipses ça ne fonctionne pas.

 

PS : j'ai reformaté ton code (diminué les retraits) pour qu'il soit plus lisible sur le forum.

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

Posté(e)

J'ai fait quelques tests avec des courbes sur des SCU non parallèles au SCG.

Je n'ai pas eu de soucis avec les spline mais avec les cercles arcs et ellipses ça ne fonctionne pas.

 

L'inverse de moi !...

Pourtant pour moi les cercles arcs et ellipses sont discritisés sur le SCG.

 

Avec les Splines j'ai un problème quand elles sont fermées.

(vlax-get (vlax-ename->vla-object (car(entsel))) 'StartTangent) 

ne fonctionne pas.

 

Bon on va laisser murir doucement, la solution finira peut être par venir

 

j'ai reformaté ton code
Merci.

 

PS:

Que représente les Knots pour une spline.

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

Posté(e)

J'ai fais quelques corrections au code ci-dessus

 

Je rappelle que ce code projète la géométrie sur le SCG (quelque soit le SCU courant) toutes les entités sélectionnées (ayant une élévation ou non) et concernées par le filtre dans le calque courant.

 

J'ai pratiquement résolu l'ensemble des entités que je veux traiter, sauf les splines (surtout celles qui sont non plane). La projection est très approchante (surtout pour celle qui sont ouvertes).

 

La question que je me pose est de savoir si il est possible de reproduire en une Spline plane une Spline non plane ayant la même géométrie vue de dessus. (J'ai peu de notions sur ce type de courbes, un peu d'aide serait le bienvenue)

 

HS:

Je viens de comprendre une erreur que je faisais jusqu'à maintenant:

Je pensais que l'utilisation de (vla-add ou l'équivalent (vlax-invoke add*** était comparable à (entmake). C'est à dire que la création se faisait dans le SCG (indépendamment du SCU en cours), et bien non. Même si l'on fourni toutes les coordonnées dans le SCG la création tient compte du SCU courant pour certain paramètres (surtout les angles) Ce qui m'a valut quelques incompréhensions de comportement de mes codes. L'appel à (vla-put 'Normal) semblait inefficace dans le code. Tu m'étonnes.... :P

 

Edit

Le truc

 (vlax-get (vlax-ename->vla-object (car(entsel))) 'StartTangent)

qui ne fonctionne pas sur des splines 3D fermées m'intrigue.

En effet pour la création on est obligé de faire

'AddSpline (liste des points) (tangente de départ) (tangente de fin)

Bizarre que ces infos ne soient pas présentes et entrainent une erreur.

erreur: AutoCAD.Application: Echec de modélisation général

 

J'ai certainement pas tout compris.... :(

 

[Edité le 10/11/2009 par bonuscad]

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

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é