Aller au contenu

zebulon_

Membres
  • Compteur de contenus

    1 489
  • Inscription

  • Dernière visite

  • Jours gagnés

    19

Tout ce qui a été posté par zebulon_

  1. 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
  2. (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
  3. zebulon_

    Ajuster sur un bloc

    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
  4. zebulon_

    Ajuster sur un bloc

    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 !
  5. .Faire une faute en posant la question, c'est une figure de style ? Amicalement Vincent
  6. 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
  7. 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
  8. 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
  9. 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
  10. zebulon_

    Cotation inversé

    Bonjour, voir ici pour avoir un lisp plus simple dont le but est le même Amicalement Vincent
  11. zebulon_

    Rotation texte et mtext

    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
  12. 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
  13. zebulon_

    Rotation cotation

    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
  14. zebulon_

    Rotation cotation

    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
  15. zebulon_

    Rotation cotation

    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
  16. 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
  17. 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
  18. 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
  19. 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
  20. 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
  21. 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
  22. Bonjour, je ne peux dire qu'une chose : fait l'essai ! Amicalement Vincent
  23. on peut disposer du fichier ? et du nom du bloc en question ? Amicalement Vincent
  24. je pense qu'il manque l'étape "choix des objets" "TOUT" qui est équivalent au lisp (ssget "_X") Amicalement Vincent
  25. 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
×
×
  • 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é