Aller au contenu

Création d'un programme éclairage public


mateus

Messages recommandés

et je n'avais pas saisis.

 

Content que tu ais enfin compris, surtout que tu devras recommencé l'opération similaire (un peu différente, nécessite l'écriture d'un fichier externe LIN) pour le type de ligne personnalisé. (à moins de prendre un type de ligne standard...)

 

Pour en revenir au bloc, avec (entmake) tu t'ai affranchi d'avoir le fichier bibliothèque présent sur ton disque. Il est défini dans le dessin mais aucunement dans un fichier sur ton disque, pour la portabilité c'est tip.top, pas besoin de fournir des fichiers bibliothèque (DWG) pour que ton lisp fonctionne. Dans l'autre cas tu aurais pu avoir des fichiers placés en dehors des dossiers de recherche par l'utilisateur (donc introuvable même si copié), d'éventuels problème de version de DWG.

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

Lien vers le commentaire
Partager sur d’autres sites

Exactement, je me coucherai moins bête ce soir comme ça :) du coup on peut carrément programmer en DXF non?

 

Allez, seconde étape:

 


)
(defun l-coor2l-pt (lst flag / )
(if lst
	(cons
		(list
			(car lst)
			(cadr lst)
			(if flag
				(+ (if (vlax-property-available-p ename 'Elevation) (vlax-get ename 'Elevation) 0.0) (caddr lst))
				(if (vlax-property-available-p ename 'Elevation) (vlax-get ename 'Elevation) 0.0)
			)
		)
		(l-coor2l-pt (if flag (cdddr lst) (cddr lst)) flag)
	)
)
)

 

J'aimerai bien avoir un peu d'éclaircissement pour ce bout de code, j'ai cru comprendre qu'il agissait par rapport à l'élévation en z éventuel du bloc mais après pas plus :/

 

J'ai recherché dans l'aide pour les fonctions suivantes:

 

vlax-property-available-p

 

Dans l'aide au développeur j'ai regardé l'ex suivant:

 

"The following examples apply to a LightweightPolyline object:

_$ (vlax-property-available-p WhatsMyLine 'Color)

T

_$ (vlax-property-available-p WhatsMyLine 'center)

nil"

 

 

 

Avec cette fonction on peut récupérer les propriétées d'une entité et éventuellement les modifier n'est ce pas? Plus particulièrement dans mon contexte qu'est ce que le code cherche à faire exactement?

 

Existerait-il l'aide au développeur en français car c'est pas toujours facile en anglais

 

Merci bien

 

:)

Lien vers le commentaire
Partager sur d’autres sites

Alors l-coor2l-pt est une fonction écrite par (gile) que j'ai légèrement modifié...

elle sert a convertir une liste produite par exemple par (vlax-get ename 'Coordinates)

Car celle-ci une liste sous la forme (X1 Y1 X2 Y2 ... Xn Yn) pour des entités 2D alors que pour des entités 3D c'est sous la forme (X1 Y1 Z1 X2 Y2 Z2 ... Xn Yn Zn) alors qu'en lisp il est plus facile de manipuler les listes qui sont sous la forme '((X1 Y1) (X2 Y2)...)) ou '((X1 Y1 Z1) (X2 Y2 Z2) ...))

 

La fonction sert à faire cette conversion (l'argument flag) sert à déterminer si la liste fournie est sous la forme 2d ou 3D (nil ou T)

 

"The following examples apply to a LightweightPolyline object:

_$ (vlax-property-available-p WhatsMyLine 'Color)

T

_$ (vlax-property-available-p WhatsMyLine 'center)

nil"

 

 

 

Avec cette fonction on peut récupérer les propriétées d'une entité et éventuellement les modifier n'est ce pas?

 

Non, elle sert à savoir si la propriété demandé est valable pour l'entité soumise.

Par exemple la propriété 'Center pour une ligne n'est pas valable (une ligne n'a pas de centre!), donc retourne nil.

 

C'est (vlax-get ename 'Property) qui retourne la valeurs de la propriété.

'Property pouvant être 'Color 'Center 'Layer 'Coordinates etc...

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

Lien vers le commentaire
Partager sur d’autres sites

Bonuscad est ce que la fonction sur les coordonnées est obligatoire parce que on utilise que des objets 2D, en plus je n'arrive pas trop à la déchiffrer cette fonction :/

 

 

Aussi je voudrais savoir comment je peux faire pour modifier le sens de décalage de la polyligne je voudrais qu'elle se décale dans l'autre sens ?

 

Merci d'avance

Lien vers le commentaire
Partager sur d’autres sites

Je sais que tu m'avais donné ça bonuscad :

 


((lambda ( / js dxf_ent p10 p11 v1 v2 det_or)
 (setq js (ssget "_+.:E:S" '((0 . "LINE"))))
 (cond
   (js
     (initget 1)
     (setq
       dxf_ent (entget (ssname js 0))
       p10 (cdr (assoc 10 dxf_ent))
       p11 (cdr (assoc 11 dxf_ent))
       v1 (mapcar '- p10 p11)
       v2 (mapcar '- p10 (getpoint "\nPoint?: "))
       det_or
       (apply '(lambda (x1 y1 z1 x2 y2 z2) (- (* x1 y2) (* y1 x2)))
         (append v1 v2)
       )
     )
     (cond
       ((> det_or 0.0) (princ "\nVous avez cliqué à gauche!"))
       ((< det_or 0.0) (princ "\nVous avez cliqué à droite!"))
       (T (princ "\nVous avez cliqué sur la ligne!"))
     )
   )
 )
 (prin1)
))

 

 

Mais je comprends pas trop et je sais pas trop ou le placer dans ton code...

 

 

Merci d'avance

Lien vers le commentaire
Partager sur d’autres sites

Mais je comprends pas trop

 

Alors le même exemple approfondi à une polyligne et en créant le décalage.

 

(vl-load-com)
((lambda ( / js dxf_obj obj_vlax p10 deriv p11 px v1 v2 det_or e_width)
 (princ "\nSélectionner une polyligne: ")
 (while
   (not
     (setq js
       (ssget "_+.:E:S"
         (list
           (cons 0 "*POLYLINE")
           (cons 67 (if (eq (getvar "CVPORT") 2) 0 1))
           (cons 410 (if (eq (getvar "CVPORT") 2) "Model" (getvar "CTAB")))
           (cons -4 "<NOT")
           (cons -4 "&") (cons 70 112)
           (cons -4 "NOT>")
         )
       )
     )
   )
   (princ "\nCe n'est pas une polyligne!")
 )
 (setq
   dxf_obj (entget (ssname js 0))
   obj_vlax (vlax-ename->vla-object (ssname js 0))
 )
 (initget 1)
 (setq
   p10 (vlax-curve-getStartPoint obj_vlax)
   deriv (vlax-curve-getfirstderiv obj_vlax (vlax-curve-getStartParam obj_vlax))
   p11 (polar p10 (atan (cadr deriv) (car deriv)) (distance p10 (vlax-curve-getEndPoint obj_vlax)))
   v1 (mapcar '- p10 p11)
   v2 (mapcar '- p10 (setq px (getpoint p10 "\nDécaler par le point?: ")))
   det_or
   (apply '(lambda (x1 y1 z1 x2 y2 z2) (- (* x1 y2) (* y1 x2)))
     (append v1 v2)
   )
   e_width (distance p10 px)
 )
 (cond
   ((> det_or 0.0) (vla-Offset obj_vlax (- e_width)))
   ((< det_or 0.0) (vla-Offset obj_vlax e_width))
 )
 (prin1)
))

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

Lien vers le commentaire
Partager sur d’autres sites

  • 3 mois après...

Bonjour mogo,

 

Je vois que tu n'as pas lâché le morceaux, tu as multiplié les posts pour résoudre ton problème de conception.

 

Malgré ce que j'ai pu te dire, tu t'es tourné vers l'usage des (command) (ce n'est pas un reproche...), mais t'as pu vite te rendre compte du casse tête que cela peut devenir avec certaine commande, tel coupure, ajuster etc...

 

je te publie le code encore un peu plus finalisé. On pourrait encore aller plus loin pour les raccords (mais à ce niveau ça se complexifie un peu plus.

 

(vl-load-com)
(if (not (tblsearch "BLOCK" "candelabre"))
 (foreach n
   '(
     (
       (0 . "BLOCK")
       (8 . "0")
       (2 . "candelabre")
       (70 . 0)
       (8 . "0")
       (62 . 0)
       (6 . "ByBlock")
       (370 . -2)
       (10 0.0 0.0 0.0)
     )
     (
       (0 . "CIRCLE")
       (100 . "AcDbEntity")
       (67 . 0)
       (410 . "Model")
       (8 . "0")
       (62 . 0)
       (6 . "ByBlock")
       (370 . -2)
       (100 . "AcDbCircle")
       (10 0.0 0.0 0.0)
       (40 . 0.053122)
       (210 0.0 0.0 1.0)
     )
     (
       (0 . "LWPOLYLINE")
       (100 . "AcDbEntity")
       (67 . 0)
       (410 . "Model")
       (8 . "0")
       (62 . 0)
       (6 . "ByBlock")
       (370 . -2)
       (100 . "AcDbPolyline")
       (90 . 6)
       (70 . 1)
       (43 . 0.0)
       (38 . 0.0)
       (39 . 0.0)
       (10 0.0689761 0.0)
       (40 . 0.0)
       (41 . 0.0)
       (42 . 0.0)
       (91 . 0)
       (10 0.034488 0.059735)
       (40 . 0.0)
       (41 . 0.0)
       (42 . 0.0)
       (91 . 0)
       (10 -0.034488 0.059735)
       (40 . 0.0)
       (41 . 0.0)
       (42 . 0.0)
       (91 . 0)
       (10 -0.0689761 0.0)
       (40 . 0.0)
       (41 . 0.0)
       (42 . 0.0)
       (91 . 0)
       (10 -0.034488 -0.059735)
       (40 . 0.0)
       (41 . 0.0)
       (42 . 0.0)
       (91 . 0)
       (10 0.034488 -0.059735)
       (40 . 0.0)
       (41 . 0.0)
       (42 . 0.0)
       (91 . 0)
       (210 0.0 0.0 1.0)
     )
     (
       (0 . "LWPOLYLINE")
       (100 . "AcDbEntity")
       (67 . 0)
       (410 . "Model")
       (8 . "0")
       (62 . 0)
       (6 . "ByBlock")
       (370 . -2)
       (100 . "AcDbPolyline")
       (90 . 5)
       (70 . 0)
       (43 . 0.0)
       (38 . 0.0)
       (39 . 0.0)
       (10 -0.0260215 -0.0463123)
       (40 . 0.0)
       (41 . 0.0)
       (42 . 0.0)
       (91 . 0)
       (10 0.0260215 -0.0463123)
       (40 . 0.0)
       (41 . 0.0)
       (42 . 0.0)
       (91 . 0)
       (10 0.0260215 -0.294391)
       (40 . 0.0)
       (41 . 0.0)
       (42 . 0.0)
       (91 . 0)
       (10 -0.0260215 -0.294391)
       (40 . 0.0)
       (41 . 0.0)
       (42 . 0.0)
       (91 . 0)
       (10 -0.0260215 -0.0463123)
       (40 . 0.0)
       (41 . 0.0)
       (42 . 0.0)
       (91 . 0)
       (210 0.0 0.0 1.0)
     )
     (
       (0 . "ARC")
       (100 . "AcDbEntity")
       (67 . 0)
       (410 . "Model")
       (8 . "0")
       (62 . 0)
       (6 . "ByBlock")
       (370 . -2)
       (100 . "AcDbCircle")
       (10 0.652129 -0.647202 0.0)
       (40 . 0.764437)
       (210 0.0 0.0 1.0)
       (100 . "AcDbArc")
       (50 . 2.66187)
       (51 . 3.49555)
     )
     (
       (0 . "LINE")
       (100 . "AcDbEntity")
       (67 . 0)
       (410 . "Model")
       (8 . "0")
       (62 . 0)
       (6 . "ByBlock")
       (370 . -2)
       (100 . "AcDbLine")
       (10 0.0649177 -0.912168 0.0)
       (11 -0.0649177 -0.912168 0.0)
       (210 0.0 0.0 1.0)
     )
     (
       (0 . "ARC")
       (100 . "AcDbEntity")
       (67 . 0)
       (410 . "Model")
       (8 . "0")
       (62 . 0)
       (6 . "ByBlock")
       (370 . -2)
       (100 . "AcDbCircle")
       (10 -0.652129 -0.647202 0.0)
       (40 . 0.764437)
       (210 0.0 0.0 1.0)
       (100 . "AcDbArc")
       (50 . 5.92922)
       (51 . 0.479719)
     )
     (
       (0 . "LINE")
       (100 . "AcDbEntity")
       (67 . 0)
       (410 . "Model")
       (8 . "0")
       (62 . 0)
       (6 . "ByBlock")
       (370 . -2)
       (100 . "AcDbLine")
       (10 -0.082228 -0.434874 0.0)
       (11 0.082228 -0.434874 0.0)
       (210 0.0 0.0 1.0)
     )
     (
       (0 . "LINE")
       (100 . "AcDbEntity")
       (67 . 0)
       (410 . "Model")
       (8 . "0")
       (62 . 0)
       (6 . "ByBlock")
       (370 . -2)
       (100 . "AcDbLine")
       (10 -0.0897754 -0.462971 0.0)
       (11 0.0897754 -0.462971 0.0)
       (210 0.0 0.0 1.0)
     )
     (
       (0 . "ARC")
       (100 . "AcDbEntity")
       (67 . 0)
       (410 . "Model")
       (8 . "0")
       (62 . 0)
       (6 . "ByBlock")
       (370 . -2)
       (100 . "AcDbCircle")
       (10 0.514429 -0.667768 0.0)
       (40 . 0.656885)
       (210 0.0 0.0 1.0)
       (100 . "AcDbArc")
       (50 . 2.53703)
       (51 . 3.56935)
     )
     (
       (0 . "LINE")
       (100 . "AcDbEntity")
       (67 . 0)
       (410 . "Model")
       (8 . "0")
       (62 . 0)
       (6 . "ByBlock")
       (370 . -2)
       (100 . "AcDbLine")
       (10 0.0832687 -0.940265 0.0)
       (11 -0.0832687 -0.940265 0.0)
       (210 0.0 0.0 1.0)
     )
     (
       (0 . "ARC")
       (100 . "AcDbEntity")
       (67 . 0)
       (410 . "Model")
       (8 . "0")
       (62 . 0)
       (6 . "ByBlock")
       (370 . -2)
       (100 . "AcDbCircle")
       (10 -0.514429 -0.667768 0.0)
       (40 . 0.656885)
       (210 0.0 0.0 1.0)
       (100 . "AcDbArc")
       (50 . 5.85543)
       (51 . 0.604567)
     )
     (
       (0 . "LINE")
       (100 . "AcDbEntity")
       (67 . 0)
       (410 . "Model")
       (8 . "0")
       (62 . 0)
       (6 . "ByBlock")
       (370 . -2)
       (100 . "AcDbLine")
       (10 -0.0832687 -0.940265 0.0)
       (11 -0.0649177 -0.912168 0.0)
       (210 0.0 0.0 1.0)
     )
     (
       (0 . "LINE")
       (100 . "AcDbEntity")
       (67 . 0)
       (410 . "Model")
       (8 . "0")
       (62 . 0)
       (6 . "ByBlock")
       (370 . -2)
       (100 . "AcDbLine")
       (10 0.0832687 -0.940265 0.0)
       (11 0.0649177 -0.912168 0.0)
       (210 0.0 0.0 1.0)
     )
     (
       (0 . "ENDBLK")
       (8 . "0")
       (62 . 0)
       (6 . "ByBlock")
       (370 . -2)
     )
   )
   (entmake n)
 )
)
(defun l-coor2l-pt (lst flag / )
 (if lst
   (cons
     (list
       (car lst)
       (cadr lst)
       (if flag
         (+ (if (vlax-property-available-p ename 'Elevation) (vlax-get ename 'Elevation) 0.0) (caddr lst))
         (if (vlax-property-available-p ename 'Elevation) (vlax-get ename 'Elevation) 0.0)
       )
     )
     (l-coor2l-pt (if flag (cdddr lst) (cddr lst)) flag)
   )
 )
)
(defun z_dir (p1 p2 / )
 (trans
   '(0.0 1.0 0.0)
   (mapcar
     '(lambda (k)
       (/ k
         (sqrt
           (apply '+
             (mapcar
               '(lambda (x) (* x x))
               (mapcar '- p2 p1)
             )
           )
         )
       )
     )
     (mapcar '- p2 p1)
   )
   0
 )
)
(defun c:mogo ( / js dxf_obj obj_vlax p10 deriv p11 v1 v2 det_or e_width ename l_pt pt_start pt_end total_dist partial_dist lst_pt
                 increment_dist js_cand AcDoc Space nb_cand dxf_ent pt_ins pt_int ang dxf_210)
 (princ "\nSélectionner le bord de la chaussée qui va servir de base pour la création du réseau ECP: ")
 (while
   (not
     (setq js
       (ssget "_+.:E:S"
         (list
           (cons 0 "*POLYLINE,LINE,ARC,CIRCLE,ELLIPSE,SPLINE")
           (cons 67 (if (eq (getvar "CVPORT") 2) 0 1))
           (cons 410 (if (eq (getvar "CVPORT") 2) "Model" (getvar "CTAB")))
           (cons -4 "<NOT")
           (cons -4 "&") (cons 70 112)
           (cons -4 "NOT>")
         )
       )
     )
   )
   (princ "\nCe n'est pas un objet curviligne valable pour cette fonction!")
 )
 (setq
   dxf_obj (entget (ssname js 0))
   obj_vlax (vlax-ename->vla-object (ssname js 0))
 )
 (initget 1)
 (setq
   p10 (vlax-curve-getStartPoint obj_vlax)
   deriv (vlax-curve-getfirstderiv obj_vlax (vlax-curve-getStartParam obj_vlax))
   p11 (polar p10 (atan (cadr deriv) (car deriv)) (distance p10 (vlax-curve-getEndPoint obj_vlax)))
   v1 (mapcar '- p10 p11)
   v2 (mapcar '- p10 (setq px (getpoint p10 "\nDonner la distance de décalage entre le bord de la chaussée et le candélabre: ")))
   det_or
   (apply '(lambda (x1 y1 z1 x2 y2 z2) (- (* x1 y2) (* y1 x2)))
     (append v1 v2)
   )
   e_width (distance p10 px)
 )
 (cond
   ((> det_or 0.0) (vla-Offset obj_vlax (- e_width)))
   ((< det_or 0.0) (vla-Offset obj_vlax e_width))
 )
 (setq
   ename (vlax-ename->vla-object (setq e_last (entlast)))
   l_pt (l-coor2l-pt (vlax-get ename 'Coordinates) nil)
   pt_start (vlax-curve-getStartPoint ename)
   pt_end (vlax-curve-getEndPoint ename)
   total_dist (vlax-curve-getDistAtParam ename (vlax-curve-getEndParam ename))
 )
 (initget 7)
 (setq partial_dist (getdist pt_start "\nSpécifiez la longueur du segment: "))
 (cond
   ((> total_dist partial_dist)
     (setq
       lst_pt (list pt_start)
       increment_dist partial_dist
       js_cand (ssadd)
     )
     (while (< increment_dist total_dist)
       (setq
         lst_pt (cons (vlax-curve-getPointAtDist ename increment_dist) lst_pt)
         increment_dist (+ increment_dist partial_dist)
       )
     )
     (setq lst_pt (reverse (cons pt_end lst_pt)) lst_candel lst_pt)
     (foreach n lst_pt
       (setq
         ang (angle '(0.0 0.0 0.0) (vlax-curve-getFirstDeriv ename (vlax-curve-getParamAtPoint ename n)))
         dxf_210 (z_dir n (polar n ang (* 0.1 partial_dist)))
       )
       (entmake
         (list
           (cons 0 "INSERT")
           (cons 100 "AcDbEntity")
           (assoc 67 dxf_obj)
           (assoc 410 dxf_obj)
           (cons 8 "ICI-RES-ECP-candelabre")
           (cons 100 "AcDbBlockReference")
           (cons 66 0)
           (cons 2 "candelabre")
           (cons 10 (trans n 0 dxf_210))
           (cons 41 (* 0.1 partial_dist))
           (cons 42 (* 0.1 partial_dist))
           (cons 43 (* 0.1 partial_dist))
           (cons 50 ang)
           (cons 210 dxf_210)
         )
       )
       (entmake (list (cons 0 "SEQEND") (cons 8 "ICI-RES-ECP-candelabre") (cons 62 0) (cons 6 "ByBlock") (cons 370 -2)))
       (setq js_cand (ssadd (entlast) js_cand))
     )
   )
   (T (princ "\nLa longueur est trop grande pour l'objet!"))
 )
 (initget 7)
 (setq e_width (- e_width (getdist pt_start "\nDonner la distance de retrait pour les cables: ")))
 (cond
   ((> det_or 0.0) (vla-Offset obj_vlax (- e_width)))
   ((< det_or 0.0) (vla-Offset obj_vlax e_width))
 )
 (entdel e_last)
 (setq ename (vlax-ename->vla-object (setq e_last (entlast))) lst_pt nil)
 (setq
   AcDoc (vla-get-ActiveDocument (vlax-get-acad-object))
   Space
   (if (eq (getvar "CVPORT") 1)
     (vla-get-PaperSpace AcDoc)
     (vla-get-ModelSpace AcDoc)
   )
 )
 (cond
   (js_cand
     (repeat (setq nb_cand (sslength js_cand))
       (setq dxf_ent (entget (ssname js_cand (setq nb_cand (1- nb_cand)))))
       (setq pt_ins (cdr (assoc 10 dxf_ent)) rot_ins (cdr (assoc 50 dxf_ent)))
       (entmake
         (list
           '(0 . "LINE")
           '(100 . "AcDbEntity")
           '(67 . 0)
           '(410 . "Model")
           '(8 . "0")
           '(62 . 0)
           '(60 . 0)
           '(6 . "ByLayer")
           '(370 . -2)
           '(100 . "AcDbLine")
           (cons 10 pt_ins)
           (cons 11 (polar pt_ins ((if (> det_or 0.0) - +) rot_ins (* pi 0.25)) (* 2 e_width)))
           '(210 0.0 0.0 1.0)
         )
       )
       (setq pt_int
         (l-coor2l-pt
           (vlax-invoke
             (vlax-ename->vla-object (entlast))
             'IntersectWith
             ename
             acExtendNone
           )
           T
         )
       )
       (if pt_int (setq lst_pt (append pt_int lst_pt)))
       (setq lst_pt (cons pt_ins lst_pt))
       (entdel (entlast))
       (entmake
         (list
           '(0 . "LINE")
           '(100 . "AcDbEntity")
           '(67 . 0)
           '(410 . "Model")
           '(8 . "0")
           '(62 . 0)
           '(60 . 0)
           '(6 . "ByLayer")
           '(370 . -2)
           '(100 . "AcDbLine")
           (cons 10 pt_ins)
           (cons 11 (polar pt_ins ((if (> det_or 0.0) - +) rot_ins (* pi 0.75)) (* 2 e_width)))
           '(210 0.0 0.0 1.0)
         )
       )
       (setq pt_int
         (l-coor2l-pt
           (vlax-invoke
             (vlax-ename->vla-object (entlast))
             'IntersectWith
             ename
             acExtendNone
           )
           T
         )
       )
       (if pt_int (setq lst_pt (append pt_int lst_pt)))
       (entdel (entlast))
     )
     (vlax-invoke Space 'AddLightWeightPolyline (apply 'append (mapcar 'list (mapcar 'car lst_pt) (mapcar 'cadr lst_pt))))
   )
 )
 (entdel e_last)
 (prin1)
)

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

Lien vers le commentaire
Partager sur d’autres sites

Merci Bonuscad pour ton post c'est vraiment sympas de votre part à tous les membres de ce site y compris toi Bonuscad d'aider les gens a mener à bien leur projet !

 

Le problème c'est que le code que tu me donnes je ne peux pas le mettre dans mon rapport , ce n'est pas moi qui l'a fait et de toute manière je ne pourrai pas expliquer le déroulement du programme car je ne comprends pas la moitié des choses.

 

Par contre je pense que mon tuteur sera ravi d'avoir ce programme donc je pourrai à la limite lui passer après mon oral mais en aucun cas le présenter.

 

Je préfère présenter ce que j'ai fais même si c'est beaucoup moins bien et moins finaliser que de présenter quelque chose que je n'ai pas fait et que je ne connais pas.

 

Par contre ce qu'il serait intéressant pour moi c'est de pouvoir insérer mon bloc candélabre avec la bonne orientation dans mon code actuel:

 



(while (< D4 LongPoly2)
;; boucle sur les abscisses depuis la position de départ par pas de l'équidistance entraxeCande 
(setq PT (vlax-curve-getPointAtDist polyCandeVla D4))
;; Calcul du point à l'abscisse courante
(setq param (vlax-curve-getParamAtPoint polyCandeVla PT))
;; calcule la parametre au point PT
(setq fDir (vlax-curve-getFirstDeriv polyCandeVla param))
;; calcule la tangente (vecteur directeur) au point PT
(setq rot (atan (cadr fDir) (car fDir)))
;; calcul la tangente au point PT

;(entmake (list (cons 0 "INSERT")
;	       (cons 2 "candelabre1")
;	       (cons 8 "ICI-RES-ECP-Candélabres")
;	       (cons 10 PT)
;	       (cons 50 rot)
;	 )
;)

(command "-insérer" "candelabre1" PT 1 1 "")



 

 

Je veux bien utiliser la création du bloc dans le programme lisp comme tu as fait dans ton programme car ça je serai l'expliquer, j'ai compris le principe mais après cette création je souhaiterai l'insérer dans la boucle aux points "PT" et que l'orientation soit bonne parce que avec mon code actuel, j'ai essayé avec les deux bouts de code ci-dessus (entmake et commande insérer) et le bloc s'insère avec une orientation de "1".

 

Merci Bonuscad

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Déjà il y a l'angle de rotation "rot" qui n'est pas fourni dans ta ligne de commande !?!?

(command "-insérer" "candelabre1" PT 1 1 "")

 

Comme tu travaille avec (command), ton code reste influencé par l'état des variables et il te faut en tenir compte.

Donc pour en tenir compte il faudrait plutôt cette syntaxe (pas trop testé).

 

Normalement que tu soit en degrés, en grades, en radians, dans le sens horaire ou anti-horaire, avec l'origine des angle à l'est ou au nord etc..., cela devrait fonctionner.

 

 

(command "_.-insert" "candelabre1" "_none" PT 1 1 (angtos ((if (zerop (getvar "ANGDIR")) - +) ang (getvar "ANGBASE")) (getvar "AUNITS") 13))

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

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Si tu veux utiliser la fonction command, ce qui est normal quand on débute (mais que tu ne tarderas pas à trouver limité), il est bon de respecter certains principes.

 

Tout d'abord tester longuement la commande qu'on souhaite utiliser en ligne de commande pour bien comprendre toutes les options et envisager tous les cas de figure.

 

Ensuite, bien garder à l'esprit que les arguments passé à command, après le nom de la commande, doivent être similaires à ceux qu'on entrerait au clavier et ont le même comportement, à savoir :

  • Les points tiennent compte du SCU courant et des accrochages aux objets actifs.
  • Les angles tiennent compte des paramètres courants : unité (AUNITS), origine (ANGBASE) et sens de rotation (ANGDIR).

Pour les options telles que Echelle, Rotation, etc. il est souvent préférable de les appeler explicitement dans l'expression LISP.

De plus, il est préférable d'utiliser les noms de commande et d'option internationaux pour éviter les problèmes de compatibilité.

 

Il ne faut pas hésiter ensuite à tester l'expression LISP depuis la ligne de commande ou la console de l'éditeur Visual LISP dans différentes situation (zoom, etc.)

ton expression pourrait donc être :

(command "_insert" "candelabre1" "_rotate" rot "_scale" 1.0 "_non" PT)

  • rot est exprimé est exprimé sous la forme d'une chaîne ou d'un nombre en unités courantes.
  • "_non" ou "auc" (pour "_none" ou "aucun") désactive temporairement tous les accrochages courants et assure que le bloc sera inséré au point spécifié.
  • PT est exprimé sous forme de chaîne ou de liste de 2 ou 3 nombres, dans le SCU courant.

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

Lien vers le commentaire
Partager sur d’autres sites

coucou

 

il faut reconnaître une chose, il est têtu, et franchement dans ma bouche c'est une qualité

et en plus respectueux du code des autres pour son examen.

je te présente toutes mes félicitations MOGO, bravo

peu importe la "qualité" et le but de ton programme, il est à toi,

si tu ne connaissais pas quelque chose tu l'as appris avant de le mettre en oeuvre

sans le copier-coller comme la majorité des consommateurs d'Internet.

oui vraiment je te félicite, continue comme çà.

si tu persistes tu peux trouver de l'aide ici.

 

j'ai toujours mon projet de didacticiel mais depuis que les journées ne font plus que 24 heures j'ai du mal à finaliser, je pense que cet hiver sera plus propice.

tu as remarqué que sur CadXP il y a un "noyau dur", et bien, toutes les personnes le composant ont un jour ou l'autre posé les questions qu'aujourd'hui tu poses.

 

amicalement

ps : je pars en congés deux semaines (au pays du lisp en plus ...) à bientôt

Lien vers le commentaire
Partager sur d’autres sites

Merci pour vos explications , le problème c'est que ça ne fonctionne toujours pas avec chacun des codes que vous me proposez :huh:

 

Mon dessin courant est en "sans unité" "degré" "sens antihoraire"

la variable "rot" vaut dans les 0.11 par là (valeur en radian)

J'ai essayé de convertir la valeur de "rot" qui est en radian en degré avant de la faire passer dans la commande, rien.

 

Ce que je comprends pas c'est qu'elle fonctionnait cette commande elle était de la même forme que celle ci:

 

(command "-insérer" "candelabre1" PT 1 1 rot "")

 

 

Déjà il y a l'angle de rotation "rot" qui n'est pas fourni dans ta ligne de commande !?!?

Désolé Bonuscad c'est moi qui avait oublié de mettre "rot" dans la commande (j'ai tellement fait de test)

 

Voilà j'aimerai bien trouver une solution pourquoi l'orientation ne se fait pas bien ?

 

 

 

(while (< D4 LongPoly2)
   ; Calcul du point à l'abscisse courante
   (setq PT (vlax-curve-getPointAtDist oVlaPoly2 D4))
   ; calcule la parametre à ce point
   (setq param (vlax-curve-getParamAtPoint oVlaPoly2 PT))
   ; calcule la tangente (vecteur directeur) à ce point
   (setq fDir (vlax-curve-getFirstDeriv oVlaPoly2 param))
   ; calcul la tangente en ce point
   (setq rot (atan (cadr fDir)(car fDir)))
   
   ; insertion du Lampadaire
   
   
   (command "_.-insert" "candelabre1" "_none" PT 1 1 rot "")
   ;(command "_.-insert" "candelabre1" "_none" PT 1 1 (angtos ((if (zerop (getvar "ANGDIR")) - +) ang (getvar "ANGBASE")) (getvar "AUNITS") 13))
   ; calcule la position de ce candélabre sur la poly3
   (setq PtPro (vlax-curve-getClosestPointTo oVlaPoly3 PT))
   ; calcul de l'abscisse de ce candélabre sur la poly3
   (setq D5 (vlax-curve-getDistAtPoint oVlaPoly3 PtPro))
   ; calcule le point début du V
   (setq PT2 (vlax-curve-getPointAtDist oVlaPoly3 (- D5 (* D2 0.5))))
   ; calcule le point fin du V
   (setq PT3 (vlax-curve-getPointAtDist oVlaPoly3 (+ D5 (* D2 0.5))))
   ; dessine la polyligne en V
   (entmake (list (cons 0 "LWPOLYLINE")
	   (cons 100 "AcDbEntity")
	   (cons 100 "AcDbPolyline")
	   (cons 8 "ECL_R")
	   (cons 90 2)
	   (cons 10 PT2)
	   (cons 10 PT)))
   
   (entmake (list (cons 0 "LWPOLYLINE")
	   (cons 100 "AcDbEntity")
	   (cons 100 "AcDbPolyline")
	   (cons 8 "ECL_R")
	   (cons 90 2)
	   (cons 10 PT)
	   (cons 10 PT3)))
	   
   
   
   ; ajoute une valeur D3
   (setq D4 (+ D4 D3))
 )

 

 

Merci

post-41726-0-87248400-1378573405_thumb.jpg

Lien vers le commentaire
Partager sur d’autres sites

c'est bon j'ai réussi, j'ai du convertir avec "angtos" et "atof".

donc

 

 

(setq rot (atan (cadr fDir)(car fDir)))

 

Donc ci-dessus "rot" vaut un angle en radian

 

(setq rotDegre(atof(angtos rot 0 13)))

 

converssion de l'angle en radian en degrés

 

 

 

(command "_.-insert" "candelabre1" "_none" PT 1 1 (+ rotDegre 180) "")

 

et du coup, la commande fonctionne comme celà .

 

A priori elle devrai marcher même si les paramètres d'unités ne sont pas en degrés non?

 

 

Merci encore pour l'aide !

Lien vers le commentaire
Partager sur d’autres sites

Oui avec cette remarque de Gile

 

rot est exprimé est exprimé sous la forme d'une chaîne ou d'un nombre en unités courantes.

 

Je suis retourné dans le cours de Gile et j'ai convertis l'angle avec ces fonctions.

Je vais l'incorporer dans le programme principal normalement ça devrait fonctionner. C'est dur de s'accrocher en programmation , je le fais bien par obligation parce que c'est assez casse tête ^^ Merci encore à vous !

Lien vers le commentaire
Partager sur d’autres sites

Bonjour voilà j'ai un problème que je n'avais pas vu avant mais que je vois maintenant bien sûr !

 

En fait le programme fonctionne lorsque le fichier lisp est chargé dans l’éditeur visual lisp d'Autocad mais lorsqu'il n'y ai pas et que par conséquent je tape directement dans la barre de commande le nom du programme , lors de l'insertion du bloc l'erreur suivante apparaît :

 

;; error nombre d'arguments insuffisants

 

Je vois pas pourquoi l'erreur apparaît alors que quand le fichier est bien chargé, il n'y a aucunes erreurs :/

 

Merci :)

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é