LUDWIG
Membres-
Compteur de contenus
1 396 -
Inscription
-
Dernière visite
Type de contenu
Profils
Forums
Calendrier
Blogs
Tout ce qui a été posté par LUDWIG
-
En fait c'est : Fichier > Gestionnaire de traçage et Fichier > Gestionnaire de style de tracé
-
TRAMBER : tu avais raison, c'est l'ordre des entités qui cause mon problème --> si la dernière entité scannée n'a pas de gbb, c'est là ou sa plante. Donc je vais chercher la correction. ZEBULON_ : moi je fais une boucle sur les entités tant que constituant_id n'est pas nul ("while constituant_id"). Je ne sais pas la recherche du SEQEND va changer quelque chose, je vais essayer. Par contre, très bonne remarque sur les Xref ! Il vaut mieux que je les filtre... Mon code pourrait marcher sur eux (quoique je viens d'essayer et j'ai une erreur) mais les Xref sont souvent lourds (plan archi entier par ex). Merci
-
Je n'ai pas autocad avec moi alors je fais de tête : Fichier --> Configuration d'imprimante Une fenêtre de l'explorateur windows ("plotters") s'ouvre avec tes fichiers PC3. Tu fournis à ton sous-traitant le fichier pc3 correspondant à ton imprimante. Celui-ci devra mettre se fichier dans le même répertoire "plotters". Ton imprimante sera définie chez lui comme s'il l'avait physiquement et il pourra ainsi créer des présentations "conformes". Si tu veux lui imposer un format d'impression, modifie le fichier pc3 pour ne laisser que le format souhaitée. Tu peux aussi lui fournir tes fichiers de styles de tracé (ctb) pour pas qu'il te fasse des présentations couleur alors que ton imprimante et n&b par exemple... Fichier --> Style de tracé. N'oublies pas de lui donner les images externes (logo de société par exemple). Profite en pour lui fournir un fichier gabarit avec ta charte de calques, et tes présentations toutes faites (avec cartouche, logo, imprimante et style de tracé prédéfinis). J'espère ne pas être tombé à côté de la plaque et avoir répondu à ta question...
-
[surligneur] TRAMBER : [/surligneur]tu as juste je n'ai pas essayé d'inverser l'ordre des entités. J'ai peut être un problème lors de la lecture de la dernière entité justement. Et si ça se trouve, l'erreur n'était pas dans le bout de code que j'ai présenté ( :mad2: )... Je testerais ça demain au boulot... [surligneur] DIDIER : [/surligneur] Je fais un lisp qui "normalise" les blocs d"un dessin quand le point d'insertion est à Pétaouchnok (c'est-à-dire hors de l'emprise du bloc). Les blocs redéfinis sont replacés correctement, et conserve les mêmes rotation et échelle. pour répondre à ta question, je cherche la getboundingbox d'un bloc de la table des blocs (c'est à dire une entité " block" pas forcement insérée dans le dessin et non une entité " insert"). Or la getboundingbox ne fonctionne pas pour un " block" (ou alors je me suis mal débrouillé ?) mais fonctionne pour CERTAINES entités qui sont à l'intérieur... donc en testant chacune des entités, je peux obtenir les points extrêmes du " block". Certaines entités pouvant être contenues dans un " block" n'ont pas de getboundingbox et la recherche de cette gbb sur ces entités renvoies une erreur. Donc quand je trouve une entité sans gbb dans le bloc, j'analyse aussitôt l'entité suivante. Mais je peux aussi avoir le cas (rarissime mais pas impossible) d'un bloc constitué uniquement d'entité sans gbb (c'est le bout de code que j'ai mis dans ce post)... auquel cas je dois ignorer le bloc (en définissant ma variable RIEN sur VRAI)... et c'est ce bout de code qui me pose problème. Ouf ! J'espère que tu as compris mes élucubrations. Quand à la différence entre ligne et droite, je serais tenter de te dire de regarder dans l'aide (haha)... La signification géométrique d'une ligne autocad, c'est un segment. La signification géométrique d'une droite autocad, c'est une droite : elle est donc illimitée et n'a pour conséquent pas de GetBoundingBox ! Je n'ai pas vraiment testé les autres entités pour voir lesquelles n'ont pas de gbb
-
rebonjour, mon [surligneur] mégalisp [/surligneur]est bientôt prêt. Mais en testant différente configuration, je m'aperçois d'une erreur dans un bout de code. (setq bloc_prop (tblnext "block" T)) (setq constituant_id (cdr (assoc -2 bloc_prop))) (while constituant_id (if (vl-catch-all-error-p (vl-catch-all-apply '(lambda ()(vla-GetBoundingBox (vlax-ename->vla-object constituant_id) 'mini 'maxi))))(setq RIEN "VRAI")(setq RIEN "FAUX") ) (setq constituant_id (entnext constituant_id)) ) [b] En plus clair : si j'ai au moins un objet dans mon bloc avec une GetBoundingBox alors RIEN=FAUX sinon RIEN=VRAI[/b] Ceci marche pour : - un bloc avec 2 lignes - un bloc avec 1 ligne et une droite (qui n'a pas de GBB) Mais quand j'ai un bloc constitué uniquement de droite, je ne m'arrête jamais de boucler. Quelqu'un voit mon erreur ? Merci d'avance.
-
Merci à tous !
-
Tramber, c'est ce que j'avais fait au début mais justement, si aucun des blocs n'est à l'échelle 1 rotation 0, ça pose problème. Et comme je suis perfectionniste (mais pas parfait), j'ai préféré m'attaquer à la table des blocs...
-
Bonjour, Juste pour savoir s'il est possible de créer un calque sans passer par command "._layer" "n"... en utilisant "entmake par exemple. J'ai essayé : (entmake (list (cons 0 "layer")(cons 2 "toto")(cons 70 0)(cons 62 7)(cons 6 "Continuous"))) mais ça ne marche pas
-
Ah oui d'accord, je connaissais mais j'ai préféré ne pas m'en servir : j'ai un seul fichier lsp avec une quarantaine de "defun", et une erreur sur n'importe quelle fonction m'aurait renvoyé vers cette fonction error. [surligneur] Patrick_35[/surligneur] Pour la simplification (cdr (assoc -1 (entget (car (entsel))))) [b] -->[/b] (car (entsel)) C'est clair c'est carrément plus simple. [surligneur] Tramber[/surligneur] J'avais cette option, de tester le type d'entité, mais je ne l'ai pas retenu :y en a tellement, et je ne sais pas lesquelles n'ont pas de GetBoundingBox (atribut, etc). En plus je suis sur Autodesk Architectural Desktop donc j'ai aussi tout les objets murs, poteaux, fenetres, portes, toits, dalles, aires, espaces, blocs à vues multiples, etc qui peuvent aussi être contenu dans un bloc. Comme ça, si Autodesk rajoute des types d'entités dans Autocad 2049, mes petits enfants pourront toujours profiter de mon lisp (haha). Il n'y aura même plus besoin de dessinateur derrière l'écran ! Non, mon lisp servira juste àredéfinir tous les blocs du dessin pour lesquels le point d'insertion n'est pas dans la GetBoundingBox. Les blocs resteront sagement à leur place (même position des entités dans le dessin, même rotation et échelles) avec le bon nom malgré le changement de point d'insertion...
-
[surligneur] TRAMBER : [/surligneur]je ne savais pas qu'il y avait aussi des commandes de gestion d'erreur en autolisp, s'est pourquoi je suis parti sur les vl-... [surligneur] Patrick_35 :[/surligneur] Yes, c'est ça ! je n'ai pas vraiment compris la fonction de lambda (même avec l'aide en français) mais je vais pouvoir me débrouiller ! Merci beaucoup à tous, je vous ferais part de mon super lisp (!)
-
Personne pour m'aider dans la gestion d'erreur ? :calim: :calim: :calim: :calim:
-
Bonjour, L'aide du développeur propose des méthodes de gestion d'erreur que j'ai du mal a mettre en application... Je souhaite tester si une manipulation renvoie une erreur ou non (en l'occurrence un getboundingbox sur un objet). Si une erreur est revoyée, je passe à l'objet suivant... [b] CE CODE RENVOIE UNE ERREUR SI L'OBJET CHOISIE N'A PAS DE GETBOUNDINGBOX (une droite par exemple)[/b] (defun c:gbb () (vla-GetBoundingBox (vlax-ename->vla-object (cdr (assoc -1 (entget (car (entsel)))))) 'mini 'maxi) (setq maxi (vlax-safearray->list maxi)) (setq mini (vlax-safearray->list mini)) (command "rectang" mini maxi) (print "emprise (2D uniquement) tracée")(princ) ) Je tente donc d erajouter 2 lignes après le defun : (defun c:gbb () [b](setq err (vl-catch-all-apply '(vla-GetBoundingBox (vlax-ename->vla-object (cdr (assoc -1 (entget (car (entsel)))))) 'mini 'maxi))) (if (=(vl-catch-all-error-p err)nil)(progn[/b] (vla-GetBoundingBox (vlax-ename->vla-object (cdr (assoc -1 (entget (car (entsel)))))) 'mini 'maxi) (setq maxi (vlax-safearray->list maxi)) (setq mini (vlax-safearray->list mini)) (command "rectang" mini maxi) (print "emprise (2D uniquement) tracée")(princ) ))) Mais mon erreur est toujours renvoyée... Y-at'il quelqu'un qui pourrait me guider ?
-
Je ne connais pas et ça pourrait m'intéresser... mais je n'arrive pas à trouver cette fonction. Quand je change la justification, le texte bouge.
-
J'en reviens à mon pb de départ. J'essaye de faire un getboundingbox et j'obtiens une erreur quand l'objet n'a pas de getboundingbox (comme une DROITE par exemple). Est-il possible de dire en lisp : "si l'objet n'a pas de getboundingbox alors..." ou "si on obtient une Erreur Automation Etendus incorrects alors..." ???
-
oui je sais, mais je me dis que ce language et tout son environnement (graphique notamment) sont plus conviviales... Aïe ! Aïe ! Non, je ne suis pas unlâcheur. Aïe.
-
Ah oui, ça c'est super comme méthode ! Il faudrait que je me lance dans le vba par la même occasion. Merci beaucoup Patrick_35 !
-
Sur quels objets va marcher vla-GetBoundingBox ? Sur quels objets ne va pas marcher vla-GetBoundingBox ? Si vla-GetBoundingBox ne fonctionne pas sur ces objets, comment récupérer les points "extrêmes" de ces objets ?
-
donc, il faut que je fasse un filtre. Si l'entité a une GetBounding, alors j'utilise cette méthode, sinon, j'en utilise une autre. - polylignes, arc, cercle : getbounding box - lignes : startpoint, endpoint - bloc, attribut : point d'insertion (???) ... [surligneur] Question : quels autres méthodes pour quels objets ?[/surligneur]
-
Bonjour, J'ai ( parfois) un message d'erreur autocad quand j'utilise GetBoundingBox. [surligneur] Erreur Automation Etendus incorrects[/surligneur] (setq bloc_prop (tblnext "block" T)) (setq constituant_id (cdr (assoc -2 bloc_prop))) ;je définis les X,Y, et Z mini et maxi de la 1ère entité du bloc (vla-GetBoundingBox (vlax-ename->vla-object constituant_id) 'mini 'maxi) (setq maxi (vlax-safearray->list maxi)) (setq mini (vlax-safearray->list mini)) (setq Xmini (car mini)) (setq Ymini (cadr mini)) (setq Zmini (caddr mini)) (setq Xmaxi (car maxi)) (setq Ymaxi (cadr maxi)) (setq Zmaxi (caddr maxi)) ;si les autres constituants ont un X, Y, Z plus grand ou plus petit que ceux précedement défini, je les enregistre (while constituant_id (vla-GetBoundingBox (vlax-ename->vla-object constituant_id) 'mini 'maxi) (setq maxi (vlax-safearray->list maxi)) (setq mini (vlax-safearray->list mini)) (if (< (car mini) Xmini )(setq Xmini (car mini))) (if (< (cadr mini) Ymini )(setq Ymini (cadr mini))) (if (< (caddr mini) Zmini )(setq Zmini (caddr mini))) (if (> (car maxi) Xmaxi )(setq Xmaxi (car maxi))) (if (> (cadr maxi) Ymaxi )(setq Ymaxi (cadr maxi))) (if (> (caddr maxi) Zmaxi )(setq Zmaxi (caddr maxi))) (setq constituant_id (entnext constituant_id)) ) ... Je crois que ça le fait à chaque fois quand un bloc contient un attribut. Mais ça le fait aussi parfois quand il est composé d'entités "simples". Quelqu'un pourrait-il m'en dire plus ?
-
Copier un bloc depuis la table des blocs
LUDWIG a répondu à un(e) sujet de LUDWIG dans Débuter en LISP
Ca marche nickel ! Pourrais-tu me commenter un peu le prog, car je ne comprends pas tout : (setq a (tblsearch "block" "MON_BLOC")) [b] --> recherche du bloc "mon bloc"[/b] (entmake (list (cons 0 "block")(cons 2 "MON_BLOC2")(assoc 70 a)(assoc 10 a))) [b] --> création du bloc "mon bloc2" à partir de du type de bloc et du point d'insertion de "mon bloc" (QUESTION : puisqu'on regarde dans la table des blocs, le point d'insertion n'est-il pas FORCEMENT 0,0,0 ?)[/b] (setq b (cdr (assoc -2 a))) [b] --> nom d'entité (QUESTION : c'est quoi par rapport au code -1, c'est le premier objet contenu dans le bloc ou l'ensemble des objets du bloc ?)[/b] (while b (setq c (entget b)) [b] --> sélectionne l'entité du bloc[/b] (setq c (vl-remove (assoc -1 c) c)) (setq c (vl-remove (assoc 5 c) c)) (setq c (vl-remove (assoc 330 c) c)) [b] --> crée une liste comme b mais sans les codes -1, 5 et 330 (??? seront-ils regénérés tous seuls ?)[/b] (entmake c) [b] --> créée le nouvel objet[/b] je ne comprends pas comment les nouveaux objets sont mis dans le nouveau bloc ? (setq b (entnext b)) [b] -->objet suivant[/b] ) (entmake '((0 . "endblk"))) [b] -->identificateur de fin de bloc[/b] (princ) -
Copier un bloc depuis la table des blocs
LUDWIG a répondu à un(e) sujet de LUDWIG dans Débuter en LISP
zebulon : oui, il me faut garder l'ancien et le nouveau bloc, donc un rename ne me convient pas... Patrick_35 : [surligneur] entmake[/surligneur], c'est ça qu'il me fallait ! Faut que j'apprenne à m'en servir via ton exemple, mais ça devrait aller. Merci ! -
Bonjour, Savez-vous comment [surligneur] copier un bloc de la table des blocs [/surligneur]et l'ajouter dans cette table des blocs (en changeant juste le nom) et sans forcement l'insérer dans le dessin ? En gros, j'ai un dessin et des blocs (A, B, C) définis (mais pas forcement insérés). Je souhaite définir les blocs A2, B2 et C2 (qui sont les copies de respectivement A, B et C) dans le dessin, sans les y insérer. Le résultat devrait être une table des blocs contenant (A, A2, B, B2, C, C2).
-
Ma commande est "wallbody" (commande Autodesk Architectural Desktop) Attdia 0 ne change rien. L'utilisation de _wallbody est acceptée mais la boîte de dialogue apparaît toujours. Et j'imagine qu'on ne peut pas sans passer d'une manière "simple". C'est pourquoi je me demandais si on pouvait modifier le code à l'origine de cette commande (fichier arx ou autre)...
-
Bonjour, Je sais ... c'est sans doute une question qui revient souvent : J'ai un lisp qui automatise des traitements sur des objets du dessin. Mais je n'arrive pas à passer outre une boîte de dialogue (malgré filedia 0 / cmddia 0 / expert 5 / utilisation de _ etc). C'est comme ça : certaines boîte de dialogue semblent incontournables. MAIS, y-aurait-il la possibilité d'aller modifier le fichier qui gère le programme lançant la boîte de dialogue ? Déjà, comment, à partir d'un nom de commande, connaître le fichier (arx, lsp, etc) ? En l'occurence, ma commande est wallbody d'Autodesk Architectural Desktop... Comment modifier un fichier ARX si s'en est un ? Merci d'avance...
-
Les " [surligneur] blocs à vues multiples[/surligneur]" existent déjà dans Autodesk Architectural Desktop, mais le fonctionnement semble légèrement différent. Ils permettent notament de définir une représentation [surligneur] 2D[/surligneur] et une représentation [surligneur] 3D[/surligneur] d'un bloc (une table par exemple). Ainsi, en vue en plan, le bloc visualisé est un simple rectangle sur le plan 0, et dans les autres vues, c'est un plateau a une certaine hauteur avec 4 pieds. Deux intérêts pour cette méthode quand on travail en plan : pas d'accroche sur un z<>0 et représentation sans les lignes cachées superflues.
