-
Compteur de contenus
1 489 -
Inscription
-
Dernière visite
-
Jours gagnés
19
Type de contenu
Profils
Forums
Calendrier
Blogs
Tout ce qui a été posté par zebulon_
-
[Résolu] Recherche pour segment en parallèle
zebulon_ a répondu à un(e) sujet de DenisHen dans Débuter en LISP
Salut Denis, cela va de soi. Surtout que tout n'est pas de moi. En regardant bien, GetPolySegs par exemple, a été inspiré par quelque chose sur Afralisp et list->variantArray, je ne sais plus où je l'ai trouvé. J'ai essayé de mettre beaucoup de commentaires, j'espère que la démarche est suffisamment compréhensible. Si tu veux te coltiner le cas des segments courbes, il y a une fonction dont je me sers régulièrement et qui pourrait être utile. Elle vient d'Afralisp aussi et elle permet, à partir d'un segment retourné par GetPolySegs, de trouver les coordonnées du centre et la valeur du rayon et Afralisp m'a permis d'éclaircir le mystère du "bulge". (defun getArcInfo (segment / a p1 bulge p2 c p3 p4 p r s result) ;; assigner variables avec les valeurs de l'argument (mapcar 'set '(p1 bulge p2) segment) (if (not (zerop bulge)) (progn ;; trouver la corde (setq c (distance p1 p2)) ;; trouver la flèche (setq s (* (/ c 2.0) (abs bulge))) ;; trouver le rayon par Pythagore (setq r (/ (+ (expt s 2.0) (expt (/ c 2.0) 2.0)) (* 2.0 s))) ;; distance au centre (setq a (- r s)) ;; coordonnées du milieu de p1 et P2 (setq P4 (polar P1 (angle P1 P2) (/ c 2.0))) ;; coordonnées du centre (setq p (if (>= bulge 0) (polar p4 (+ (angle p1 p2) (/ pi 2.0)) a) (polar p4 (- (angle p1 p2) (/ pi 2.0)) a) ) ) ;; coordonnées de P3 (setq p3 (if (>= bulge 0) (polar p4 (- (angle p1 p2) (/ pi 2.0)) s) (polar p4 (+ (angle p1 p2) (/ pi 2.0)) s) ) ) (setq result (list p r)) ) (setq result nil) ) result ) GetPolySegs et GetArcInfo sont deux fonctions que je trouve très pratiques dès qu'il s'agit d'exploiter des lwpolylines. Amicalement Vincent -
[Résolu] Recherche pour segment en parallèle
zebulon_ a répondu à un(e) sujet de DenisHen dans Débuter en LISP
(defun getpolySegs (ent / PTL I PTB SEG LSEG) (if (= (type ent) 'ENAME) (setq ent (vlax-ename->vla-object ent)) ) ;; collecter la liste des point sous la forme (x1 y1 x2 y2 ... xn yn) (setq PTL (vlax-safearray->list (vlax-variant-value (vla-get-Coordinates ENT)))) ;; collecter la liste des bulges (setq I 0) (repeat (/ (length PTL) 2) (setq PTB (cons (vla-GetBulge ent I) PTB)) (setq I (1+ I)) ) (setq PTB (reverse PTB)) ;; polyligne fermée -> rajouter le premier point à la liste de points (if (= (vla-get-closed ent) :vlax-true) (setq PTL (append PTL (list (car PTL) (cadr PTL)))) ) ;; transformer en liste de segments (setq I 0) (repeat (- (/ (length PTL) 2) 1) (setq SEG (list (list (nth I PTL) (nth (+ I 1) PTL)) (nth (/ I 2) PTB) (list (nth (+ I 2) PTL) (nth (+ I 3) PTL)) ) ) (setq LSEG (cons SEG LSEG)) (setq I (+ I 2)) ) (reverse LSEG) ) (defun PTaDroiteObj (obj pt / PTN PM fder PT1DERIV) (if (= (type Obj) 'ENAME) (setq Obj (vlax-ename->vla-object Obj)) ) (setq PTN (vlax-curve-GetClosestPointTo obj PT)) (setq PM (vlax-curve-GetParamAtPoint obj PTN)) (setq fder (vlax-curve-getfirstderiv obj PM)) (setq PT1DERIV (mapcar '+ PTN fder)) (< (sin (- (angle PTN PT) (angle PTN PT1DERIV))) -1e-14) ) (defun list->variantArray (ptsList / arraySpace sArray) ; allocate space for an array of 2d points stored as doubles (setq arraySpace (vlax-make-safearray vlax-vbdouble ; element type (cons 0 (- (length ptsList) 1) ) ; array dimension ) ) (setq sArray (vlax-safearray-fill arraySpace ptsList)) ; return array variant (vlax-make-variant sArray) ) (defun c:OfPol (/ AcDoc Space temp e obj PT numseg lseg seg PTD BULGE PTF PTC ANG L PTDD PTFD pl) (vl-load-com) (setq AcDoc (vla-get-activeDocument (vlax-get-acad-object)) Space (if (= (getvar "CVPORT") 1) (vla-get-PaperSpace AcDoc) (vla-get-ModelSpace AcDoc) ) ) ;; valeur du décalage (if (not od_ofpol) (setq od_ofpol 1.00)) ;; par défaut 1.00 (if (setq TEMP (getdist (strcat "\nSpécifiez la distance de décalage ou <" (rtos od_ofpol) "> : "))) (setq od_ofpol temp) ) ;; saisir la poyligne (setq e (entsel "\nSélectionner un segment de polyligne : ")) (setq obj (vlax-ename->vla-object (car e))) (setq PT (trans (cadr e) 1 0)) ;; le point cliqué pour sélectionner en SCG ;; on est sur quel segemnt ? (setq numseg (fix (vlax-curve-GetParamAtPoint obj (vlax-curve-GetClosestPointTo obj PT)))) (alert (strcat "on est sur le segment " (itoa numseg))) ;; trouver les points d'extrémité du segment (setq lseg (getpolysegs obj)) ;; la liste des segments définis par leurs points d'extrémité et bulges (setq seg (nth numseg lseg)) ;; le segment sélectionné (setq PTD (car seg)) (setq BULGE (cadr seg)) (setq PTF (caddr seg)) (if (zerop bulge) (progn (setq PTC (getpoint "\nQuel côté ?")) (if (PtaDroiteObj obj (trans PTC 1 0)) (progn (setq ANG (* 3 (/ pi 2))) (alert "à droite")) ;; on tourne à droite (progn (setq ANG (/ pi 2)) (alert "à gauche")) ;; on tourne à gauche ) (setq PTDD (polar PTD (+ (angle PTD PTF) ANG) od_ofpol)) ;; décaler les points d'extrémité de la distance od_ofpol (setq PTFD (polar PTF (+ (angle PTD PTF) ANG) od_ofpol)) (setq L (distance PTD PTF)) ;; la longueur du segment (setq PTDD (polar PTDD (angle PTDD PTFD) (* L 0.2))) ;; donner la forme de bateau à la polyligne (setq PTFD (polar PTFD (angle PTFD PTDD) (* L 0.2))) ;; en décalant encore de 20% de la distance ;; dessiner la polyligne (setq pl (vla-addlightWeightPolyline space (list->variantArray (append PTD PTDD PTFD PTF)))) ) (alert "Segment courbe, pas prévu pour le moment") ) ;; fin if (princ) ) quelque chose de ce style ? Amicalement Vincent -
Bonjour, Je travaille dans le domaine des ouvrages d'art et il m'arrive d'avoir besoin de "coupes biaises" quand le pont est "biais". On fait la coupe droite et, partant de celle-ci, on obtient la coupe biaise à partir d'un bloc dont l'échelle en x est égale au "k" et y=1. La valeur de k étant (1/sin a) et a étant l'angle entre l'axe de la voie portée et l'axe de la voie traversée. Si a=100gr, on n'a pas besoin de coupe biaise, on s'en doute :) Mais dans tous les autres cas, si. Et l'insertion de bloc est le seul moyen à ma connaissance qui permet de déformer avec des échelles non uniformes. C'est là que j'ai remarqué que les blocs aux échelles non uniformes ne pouvaient pas servir de seuil pour étirer et prolonger. Par ailleurs, on remarque aussi pour un bloc non uniforme, lors d'une décomposition, que celle-ci est très "violente". C'est à dire que s'il y a des objets complexes (polylignes, blocs...) qui composent le bloc qu'on explose, ces objets complexes seront décomposés également, alors que pour un bloc aux échelles uniformes, lors de sa décomposition, les polylignes, blocs... qui le composent gardent leur intégrité. Amicalement Vincent
-
Bonjour, quand un bloc a des échelles x, y ou z qui ne sont pas identiques, les éléments qui le constituent ne peuvent pas servir comme seuil pour un prolongement ou un ajustement. Mais, lorsqu'on observe avec la fenêtre propriétés le bloc incriminé, les échelles x, y et z semblent être les mêmes. Sauf que, si on pousse un peu plus loin et qu'on change la précision dans les unités de dessin (en mettant 8 chiffres après la virgule, par exemple), on s'aperçoit que les échelles des x et y (0.31842223) sont identiques mais différentes de celle de z (0.32000000). Alors que le bloc qui fonctionne bien, lui, il a des échelles identiques en x, y et z (0.32744979) D'où le comportement qui semble irrationnel à première vue. Ce n'est donc pas le bloc qui est en cause, mais la façon dont tu l'insères. La question qu'il faut se poser est de savoir comment tu as fait pour avoir une échelle z différente d'un milli-chouïa. Amicalement Vincent PS : si on est à deux chiffres après la virgule en précision et qu'on tape 0.32 dans la case echelle X (ou Y) de la boite de dialogue "propriétés", la valeur initiale 0.31842223 est conservée. C'est un comportement curieux :( 0.32, ce n'est pas pareil que 0.31842223, mais c'est pareil que ce qui est affiché... Pour que la valeur initiale soit changée, il faut taper 0.320 : c'est bizarre !
-
ZWFRANCE - Formateur CAO/DAO, Programmeur
zebulon_ a répondu à un(e) sujet de ZWCAD-France dans Emploi, monde du travail
.Faire une faute en posant la question, c'est une figure de style ? Amicalement Vincent -
ZWFRANCE - Formateur CAO/DAO, Programmeur
zebulon_ a répondu à un(e) sujet de ZWCAD-France dans Emploi, monde du travail
J'ai le plaisir de connaitre quelques vieux menuisiers. Et, plus ils sont vieux, moins il leur reste de doigts... Heureusement que les temps changent et que la sécurité des machines, en menuiserie et ailleurs, a été revue à la hausse, ce qui permet aux jeunes menuisiers d'avoir plus de chance de garder leurs doigts (et leurs poumons...) jusqu'à la retraite. Enfin, ils garderont leurs doigts mais n'auront pas de retraite, au rythme où ça va :D. Pour revenir à l'annonce, quand je disais "LA perle rare", je ne pensais pas que c'était à ce point ! Amicalement Vincent -
ZWFRANCE - Formateur CAO/DAO, Programmeur
zebulon_ a répondu à un(e) sujet de ZWCAD-France dans Emploi, monde du travail
Bonjour, j'ai regardé le profil du poste. C'est un cheval de course qui est recherché :D Perso, je trouve que proposer un CDD à une pointure (on doit pouvoir compter les membres de CADXP sur les doigts des 2 mains qui répondent aux critères, et je n'en fais pas parti) ne me semble pas être un argument en béton pour faire venir LA perle rare. Mais bon, je ne suis pas DRH et les temps sont durs ! Amicalement Vincent -
[Résolu] Attribut, mise en forme de texte et retour charriot
zebulon_ a répondu à un(e) sujet de Moon_LS dans AutoCAD 2017
ce n'est pas faux. La démarche est cependant la même : éditeur de bloc, rajout d'un ou deux attributs, fermer éditeur de bloc, battman pour synchroniser et éventuellement réorganiser l'ordre des attributs lors de l'insertion du bloc. Amicalement Vincent -
[Résolu] Attribut, mise en forme de texte et retour charriot
zebulon_ a répondu à un(e) sujet de Moon_LS dans AutoCAD 2017
Bonjour, Les cartouches avec des attributs, cela n'a rien d'exceptionnel. Pour modifier un attribut, il faut sélectionner le bloc, puis clic à droite "éditeur de bloc". Une fois qu'on est dans l'éditeur de bloc, on sélectionne l'attribut à modifier puis "propriétés" et on change "ligne multiples" en "oui". Une fois que c'est fait, on clique sur "fermer éditeur de blocs" pour revenir au dessin. Pour finir, on lance la commande battman pour synchroniser les occurrences du bloc modifié qui ont déjà été insérées. Amicalement Vincent -
Bonjour, voir ici pour avoir un lisp plus simple dont le but est le même Amicalement Vincent
-
Merci c'est très clair ! Les lignes de repères multiples sont d'ailleurs très voisines des textes multiples de ce point de vue. Ce qui est surtout gênant, c'est le fait que les propriétés aient le même nom "Rotation" et qu'elles n'aient pas la même signification selon le cas. Pour un MTEXT, si on regarde le code de groupe 50, on le voit évoluer en fonction du scu également Alors que pour le texte "ligne", ce code de groupe 50 reste constant quel que soit le scu Il en est de même si on scrute la rotation de ces objets dans la fenêtre propriétés. Amicalement Vincent
-
Bonjour, je me suis placé dans un scu tourné de 180° par rapport au SCG et j'ai créé un TEXT et un MTEXT. En regardant les propriétés du TEXT : on voit une rotation de pi. On en conclu que la propriété "Rotation" est relative au SCG Les propriétés du MTEXT : on voit une rotation de 0.0 et on conclu que la propriété "Rotation" dépend du scu local. Je me demande en quoi c'est logique ? Amicalement Vincent
-
Pfff! il y en a un qui vient de me dire : "si t'as une côte à l'envers, t'as qu'à aller voir un ostéopathe..." :D C'est une autre solution, en effet, et c'est encore mieux que le lisp si on fait abstraction de l'accent circonflexe sur le o ! Mais il est vrai qu'on voit souvent la confusion entre "côte" et "cote". Pfff... voilà qu'il me parle de poules, maintenant... Il a bouffé un clown ce matin ! Amicalement Vincent
-
Bonjour, contrairement aux cotes qui gardent "la tête haute" quand on leur applique une rotation et qui, par conséquent, ont la tête vers la bas quand on tourne le scu, les textes de lignes de repères multiples s'orientent selon l'angle de rotation donné par la commande Rotation. Donc, si on applique une rotation de 180° à une ligne de repère multiple, le texte aura la tête vers le bas et si on tourne le scu de 180°, le texte sera dans le bon sens. J'en conclue que le problème est beaucoup moins criant avec ces objets. Cependant, si on fait un miroir au lieu d'une rotation, le texte de repère multiple garde la tête haute aussi. On peut intervenir sur ces objets en modifiant la propriété "TEXTROTATION" qu'il faudra mettre à 0. Cette propriété change de valeur si on change de scu. L'angle 0 c'est celui du scu courant et non du scg. En ce sens, les lignes de repères multiples fonctionnent comme les textes multiples. J'ai rajouté les lignes de repères multiples et les textes au lisp ci-dessus. Amicalement Vincent
-
Bonjour, (vl-load-com) (defun c:rotdim (/ s ANG) (setq ANG (getvar "VIEWTWIST")) (if (ssget '((0 . "DIMENSION,MULTILEADER,TEXT,MTEXT"))) (progn (vlax-for o (setq s (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object)))) (cond ((= (vla-get-objectname o) "AcDbMLeader") (vla-put-textrotation o 0)) ((= (vla-get-objectname o) "AcDbMText") (vla-put-rotation o 0)) (T (vla-put-rotation o ANG)) ) ) (vla-delete s) ) ) (princ) ) ce à quoi j'ai abouti : je récupère le "viewtwist" de mon scu et je colle cet angle dans les objets cotations qui ont la tête vers le bas après une rotation, puis le texte se remet proprement dans la bonne position. Cela me semble plus simple que de récupérer l'angle de chaque cote et de rajouter pi. En lisp pur et dur, je pense que j'aurais pu passer un entmod du code dxf 51 qui doit être l'équivalent de la propriété "rotation". Dans ce sujet, on avait parlé de ce problème et la solution proposée par PHILPHIL semble beaucoup plus complexe. Amicalement Vincent
-
Bonjour, je suis dans un scu quelconque et je fais une cotation linéaire ou alignée. J'applique une rotation avec copie de 180° à mon dessin, pour faire la façade opposée par exemple, et je tourne mon scu de 180°. Les nouvelles cotes auront la tête vers le bas. Quand on agit sur la propriété "rotation du texte" on peut arriver à rétablir les choses mais c'est pas génial. En regardant de plus près, on voit qu'il y a aussi une propriété "rotation", mais que je n'arrive pas à trouver dans la fenêtre des propriétés. on récupère la valeur "rotation" avec (setq rot (vla-get-rotation e)), on lui rajoute la valeur pi et on réinjecte cette valeur avec (vla-put-rotation e (+ rot pi)) et là c'est beaucoup mieux. On peut pas faire autrement qu'avec lisp pour modifier cette propriété ? Merci Amicalement Vincent
-
Extraction des coordonnées des noeuds des polylignes
zebulon_ a répondu à un(e) sujet de youssefb dans AutoCAD 2011
Bonjour (Gile), effectivement les fonctions vlax-curve sont bien utiles. Cependant, le param utilisé par certaines de ces fonctions reste assez mystérieux. En y regardant de plus prêt, la fonction (vlax-curve-getParamAtPoint curve-obj point) peut s'avérer très utile pour déterminer sur quel segment de la polyligne curve-obj se situe le point. Le paramètre renvoyé s'il est par exemple 1.5, alors on sait que le point est au milieu du 2ème segment, s'il est 2.75 alors il est au 3/4 du 3ème segment... si le point est un sommet, on a une valeur entière. J'ai fait quelques essais sur une polyligne car je n'ai pas trouvé dans l'aide ce que signifie ce Param où on nous dit uniquement "A number representing a parameter..." ce qui n'est pas très parlant ! A toutes fins utiles, espérant ne pas être hors sujet Amicalement Vincent -
C'est l'objectif, effectivement. Personnellement, si déjà il faut se coltiner une routine pour automatiser, plutôt que de faire une routine qui imprime, je ferais une routine qui crée les présentations. Mon logiciel de ferraillage crée ses nomenclatures dans l'espace objet, puis une routine repère les blocs qui représentent les pages de nomenclature et me crée une présentation par page de nomenclature, avec la bonne mise en page, nommée et tout. Comme dit plus haut, je n'ai pas l'expérience de cahiers au format bible, mais la commande publier, surtout depuis qu'on peut publier vers un pdf, ainsi que etransmit pour d'autres raisons, me font gagner un temps énorme. Amicalement Vincent
-
j'aime bien la description et je m'y retrouve un peu. Personnellement, je fais des tonnes et des tonnes de ferraillage et mes cahiers de ferraillage sont toujours présentés dans des présentations (c'est fait pour) et chaque présentation est mise en page avec une configuration nommée, ce qui permet d'en changer rapidement, sans outil lisp supplémentaire. Les mises en page dans l'espace objet, je trouve cela peu pratique et archaïque et pas seulement parce que cela ne correspond pas à mes habitudes pas vraiment souples. Quand je lis je ne peux pas être d'accord. Un cahier de présentations, même s'il y a beaucoup de pages, c'est tellement pratique pour publier vers son imprimante ou vers un pdf, que je me demande comment on peut faire autrement. On peut aller plus loin avec les jeux de feuilles, mais pour ceux qui sont déjà réticents avec les présentations de l'espace papier, ce serait la quatrième dimension.D'un autre côté, cela ne m'est jamais arrivé de faire un cahier de 200 feuillets ! Là, je pense qu'il y a un problème au niveau du plan : on aura voulu faire rentrer tout le projet sur le même document ! On a le droit de découper un gros problème en plusieurs petits et il aurait peut être mieux valu faire 10 plans de 20 feuillets. D'une part, on peut travailler à 10 sur le même projet et, d'autre part, on évite de gérer un mastodonte. Sans parler de la machine "musclée" qu'il faut pour être en mesure de gérer ces mastodontes. Moi, avec mon PC de crotte et mes fichiers de 300Ko, j'ai l'air ridicule. Amicalement Vincent
-
[Résolu] Modifier des attributs de blocs dans les espaces papiers
zebulon_ a répondu à un(e) sujet de zza427 dans AutoCAD 2015
c'était le but de mon complément. ce qui répond à la question de Philsogood. Dans le cas présent, on a des cartouches à modifier qui en principe sont dans l'espace papier et il faudra faire la manip à partir de l'espace papier. Amicalement Vincent -
[Résolu] Modifier des attributs de blocs dans les espaces papiers
zebulon_ a répondu à un(e) sujet de zza427 dans AutoCAD 2015
Bonjour, effectivement, _qselect ne fonctionne qu'avec la présentation courante lorsqu'on applique une commande à la sélection, comme EFFACER ou autre. Mais, lorsqu'on est dans la fenêtre PROPRIETES, on peut agir sur les propriétés de tous les objets qu'ils soient en espace objet ou sur n'importe quel onglet. Bien sûr, cela fonctionne d'autant plus finement avec la commande FILTRER. J'ai fait l'essai avec un bloc inséré dans l'espace objet et dans deux présentations de l'espace papier. Il existe donc trois fois dans le fichier. Avant la manip, la vue de la présentation 1 Avant la manip, la vue de la présentation 2 Après la manip, on voit que l'attribut est changé dans l'espace objet ainsi que dans la présentation 1 et dans la présentation 2 le tout avec la fenêtre PROPRIETES et son bouton _qselect. L'intérêt est qu'on évite le lisp, sans que cela deviennent une usine à gaz et ma question est de savoir si ça fonctionne aussi bien avec une LT ? Amicalement Vincent -
[Résolu] Modifier des attributs de blocs dans les espaces papiers
zebulon_ a répondu à un(e) sujet de zza427 dans AutoCAD 2015
Bonjour, je ne peux dire qu'une chose : fait l'essai ! Amicalement Vincent -
[Résolu] Modifier des attributs de blocs dans les espaces papiers
zebulon_ a répondu à un(e) sujet de zza427 dans AutoCAD 2015
on peut disposer du fichier ? et du nom du bloc en question ? Amicalement Vincent -
[Résolu] Modifier des attributs de blocs dans les espaces papiers
zebulon_ a répondu à un(e) sujet de zza427 dans AutoCAD 2015
je pense qu'il manque l'étape "choix des objets" "TOUT" qui est équivalent au lisp (ssget "_X") Amicalement Vincent -
[Résolu] Modifier des attributs de blocs dans les espaces papiers
zebulon_ a répondu à un(e) sujet de zza427 dans AutoCAD 2015
Des heures ? C'est vrai qu'on a vite fait de perdre du temps à passer d'une présentation à l'autre et ce pour faire 15x la même chose. Il faut s'estimer heureux, cependant, que tes cartouches aient été conçus avec des attributs, sinon cela aurait été encore plus la galère ! On peut aussi y arriver sans le lisp : on va directement dans la commande PROPRIETES, on clique sur le bouton sélection rapide (en haut à droite). La sélection rapide s'ouvre puis on clique sur le bouton "Choix des objets" (en haut à droite aussi) et à l'invite "choix des objets" on répond TOUT puis <┘(pour faire le filtre sur tous les objets de toutes les présentations, et pas seulement sur le "dessin entier" qui porte mal son nom car cela ne représente que la présentation courante). Puis à la ligne "type d'objet" on choisit "référence de bloc", dans les propriétés on choisit "nom", dans l'opérateur on prend "égal à" et dans la valeur on indique le nom du bloc concerné. Puis, après avoir validé la sélection rapide par un clic sur OK, on revient dans la liste des propriétés où on peut changer les attributs globalement. Cela permettrait de faire la manip sur une LT ? Amicalement Vincent
