alala
Membres-
Compteur de contenus
289 -
Inscription
-
Dernière visite
Type de contenu
Profils
Forums
Calendrier
Blogs
Tout ce qui a été posté par alala
-
L'épaisseur est globale sur les polylignes ou sur chaque tronçon de polyligne? Tu peu regarder ce que donne les propriétes de tes polylignes via Vlax-dump-object et si tu en a une qui correspond un vlax-get-property te donnera l'info pour chaque objets. Dans ce cas il ne restera qu'a compter les objets ou les longueurs par epaisseur suivant ton besoin. Tu a presque tout pour y arriver .. si tu a un peu de temps ;). ps : en semaine prochaine j'aurai un autocad sous la main je pourrais éventuellement te faire ça en partie.
-
incrémenter...et surtout décrémenter!
alala a répondu à un(e) sujet de bono05 dans LISP et Visual LISP
Modifie comme ceci : (defun c:bono05 (/ obj) (vl-load-com) (if (vlax-property-available-p (setq obj (vlax-ename->vla-object (car (nentsel)))) 'TextString T) (vla-put-TextString obj (decr_txt (vla-get-TextString obj))) (princ "\nSélection non valable... ") ) (c:bono05) (princ) ) Et ça devrait boucler tan que tu ne quite pas la commande ('esc' par exemple). -
incrémenter...et surtout décrémenter!
alala a répondu à un(e) sujet de bono05 dans LISP et Visual LISP
Une fonction appelle l'autre, donc tu doit avoir les 2 codes de chargés. Le plus simple c'est de faire un seul lisp : (defun decr_txt (Txt / Boucle Decalage Val_Txt) (setq Boucle 1 Val_txt "" ) (while (<= Boucle (strlen Txt)) (setq Ascii_Txt (vl-string-elt Txt (- (strlen Txt) Boucle))) (if (not Decalage) (setq Ascii_Txt (1- Ascii_Txt)) ) (if (or (= Ascii_Txt 47) (= Ascii_Txt 64) (= Ascii_Txt 96)) (setq Ascii_Txt (cond ((= Ascii_Txt 47) 57) ((= Ascii_Txt 64) 90) ((= Ascii_Txt 96) 122) ) Decalage nil ) (setq Decalage T) ) (setq Val_Txt (strcat (chr Ascii_Txt) Val_Txt)) (setq Boucle (1+ Boucle)) ) (if (not Decalage) (setq Val_Txt (strcat (cond ((> Ascii_Txt 47) "9") ((> Ascii_Txt 90) "Z") ((> Ascii_Txt 122) "z") ) Val_Txt ) ) ) Val_Txt ) (defun c:bono05 (/ obj) (vl-load-com) (if (vlax-property-available-p (setq obj (vlax-ename->vla-object (car (nentsel)))) 'TextString T) (vla-put-TextString obj (decr_txt (vla-get-TextString obj))) (princ "\nSélection non valable... ") ) (princ) ) Sinon tu fait deux lisp et tu les charges tous les deux. -
Sur un If la première action est "si vrais" et la seconde "sinon". Donc ici si l'on a un lsta déjà définit on fait le premier setq, sinon l'on le définit avec le second. Vu que tu parcours tous les objets que tu sélectionne, tu pourrait faire plus simple en ne parcourant qu'une fois ta sélection via une boucle vlax-for L'on pourrais écrire : (defun c:m-vrd ( / ss surfb totb layb l_layb lstb longa tota laya l_laya lsta) (vl-load-com) (setq ss (ssget '((0 . "LWPOLYLINE,LINE")))) ;sélection des lignes et polylignes (vlax-for pl (setq ss (vla-get-ActiveSelectionSet (vla-get-ActiveDocument (vlax-get-acad-object)))) ;pour chaque objet de la sélection (if (vlax-curve-isClosed pl) ; si fermé (progn ;pour les polylignes fermés (setq surfb (vlax-curve-getArea pl)) (setq totb (+ totb surfb)) (setq layb (vla-get-Layer pl)) (if (setq l_layb (assoc layb lstb)) (setq lstb (subst (cons layb (+ surfb (cdr l_layb))) l_layb lstb) ) (setq lstb (cons (cons layb surfb) lstb)) ) ) (progn ;pour les polylignes ouvertes (setq longa (vlax-curve-getDistAtParam pl (vlax-curve-getEndParam pl) )) (setq tota (+ tota longa)) (setq laya (vla-get-Layer pl)) (if (setq l_laya (assoc laya lsta)) (setq lsta (subst (cons laya (+ longa (cdr l_laya))) l_laya lsta) ) (setq lsta (cons (cons laya longa) lsta)) ) ) ) ) (mapcar '(lambda (x) (princ (strcat "\nLongueur totale sur le calque " (car x) " : " (rtos (cdr x)) ) ) ) lsta ) (princ (strcat "\nLongueur totale dans le dessin = " (rtos tota)) ) (mapcar '(lambda (x) (princ (strcat "\nSURFACE totale sur le calque " (car x) " : " (rtos (cdr x)) ) ) ) lstb ) (princ (strcat "\nSURFACE totale dans le dessin = " (rtos totb)) ) (princ) (textscr) ) A tester car je n'ai pas d'autocad sous la mains. Pour avoir pu tester quelques codes sur des plans avec beaucoup d'objet je conseillerais de faire un minimum de parcours de sélections, c'est ce qui demande le plus de temps de traitement. Ici tu parcours 2x toute la sélection alors qu'une seule suffit, sur nombre de plans ce n'est pas grave mais quand tu atteindra les 1000 ou 10000 objet ça le deviendra!
-
Oups j'avais effectivement pas pensé à tester sur des lignes. Pour mon code il est inspiré par la solution qui m'avait été proposé dans le sujet mis en lien ci dessus. (le logand reste bien obscure pour moi) Merci beaucoup VDH-Bruno pour tout le savoir que tu m'apporte (et aux autres aussi je pense) par tes messages!
-
Quelque chose dans ce genre? (if (setq ss (ssget '((0 . "*POLYLINE,LINE")))) (progn (setq ssa (ssadd)) (setq ssb (ssadd)) (setq i 0) (repeat (sslength ss) (if (zerop (logand (cdr (assoc 70 (entget(ssname ss i)))) (+ 1))) (ssadd (ssname ss i) ssa) (ssadd (ssname ss i) ssb) ) (setq i (1+ i)) ) ) ) Par contre ce sera une opération très lente si il y a beaucoup d'objets.
-
incrémenter...et surtout décrémenter!
alala a répondu à un(e) sujet de bono05 dans LISP et Visual LISP
(setq var(1- var)) dans les routines en question!? -
Tente un : (command "_etransmit" pause) Par contre dans ce cas la ton etransmit se fait en ligne de commande, donc a toi de voir les infos à passer pour que ça fasse ce que tu souhaite.
-
A remplacer : (command "_etranmit") par : (command "_etransmit") ;)
-
Je suis dans la même situation, ou presque.J'ai commencé le Lisp une semaine environ avant de m'inscrire ici, et je patauge à mort. Et je trouve ça frustrant, mais aussi extremement motivant. Perso j'utilise un ensemble de sites (trouvés sur ce forum pour la plupart) pour m'aider : - http://web2.airmail.net/terrycad/Tutorials/MyDialogs.htm#Start - http://docs.autodesk.com/ACD/2010/ENU/AutoCAD%20.NET%20Developer%27s%20Guide/index.html - http://www.lee-mac.com/programs.html#general - http://www.afralisp.net/index.php - http://www.afralisp.net/archive/methods/methods_ref.htm (très important pour les méthodes) - http://www.cadfr.com/ Le soucis en entreprise c'est que généralement le temps passé à dévellopper de petites routines n'est pas considéré comme du temps gagné sur le travail mais comme du temps "à rien faire". Dernièrement j'ai pus prouvé l'intérêt de la chose en gagnant 6 mois de travail via une routine crée en quelques jours/semaines, mais ce n'est pas toujours possible. En ce qui concerne la formation, personnellement je m'autoforme sur quelques languages quand j'en ai le besoin et l'envie (le VBA pour ACCESS, le C pour quelques bidouilles sous linux, ...) et je trouve le LISP (et VLISP) très intéressant et très "puissant" sous Autocad. L'abscence de compilation et la possibilité de passer les action en ligne de commande sont de vrais plus pour l'apprentissage. Maintenant, et à la vue des capacités de certains sur le forum (j'en suis toujours épaté) je reste persuadé que pour atteindre un certain niveau il faut du temps et du transfert de connaissances que seul une bonne formation peu apporter.
-
Ça ne me parrait pas impossible, mais si tu veu automatiser un maximum le plus simple serais de savoir définir la sélection du texte en fonction d'une variable commune à tous ceux-ci en fonction du bloc. Par exemple si tous tes texte sont à une distance ou une position précise (ou maxi) par rapport au bloc à attacher. Au pire il faudra sélectionner chaque bloc et chaque texte associé. Maintenant ton bloc dispose il d'un attribut? Faudrait il le créer? A tu le bloc qui le remplacerait? Un sujet en rapport : http://cadxp.com/index.php?/topic/30010-convertir-texte-en-attribut/ Un autre : http://cadxp.com/index.php?/topic/25036-est-il-possible-de-transformer-un-texte-en-bloc-avec-attribut/ Et il y en pas mal sur le net dans ce genre.
-
Pas de soucis, si ça peu dépanner, c'est le genre de truc qui arrive au taf et auquel on ne pense pas!
-
Merci Patrick. j'avoue utiliser la méthode d'appel et de déchargement sans réelement la comprendre, avec tes explications ça marche mieux est, me semble plus logique.
-
Il ne manquerais pas un (unload_dialog id) juste après ton (start_dialog)?!* perso j'applique ceci : (setq dcl_id (load_dialog temp)) ;on charger le DCL (if (new_dialog "Mon_dcl" dcl_id) (progn (set_tile "..." "...") (action_tile "accept" "(setq ...)(done_dialog 1)") ;clic sur "OK" (action_tile "cancel" "(done_dialog 0)(setq sortie 1)") ;clic sur "Cancel" (setq status (start_dialog)) (unload_dialog dcl_id) ) ) (if (= sortie 1) (progn (prompt "\n...ABANDON" ) (quit) (princ) ) )
-
Je pense que le soucis est ici, il faut ajouter le répertoire ou est situer le DCL à la liste des chemin de recherche dans les option d'AutoCad.Sous 2011 que j'ai sous la main il faut se rendre dans "Option", dans l'onglet "Fichier" puis sur "Chemin de recherche des fichiers de support" Et la ajouter une entrée correspondante à l'emplacement de ton fichier DCL.
-
la selection sur le point de création de la polyligne doit prendre le segment précédent à chaque fois. Tente de remplacer : (command "_.fillet" pt1 pt2 "") Par un truc du genre : (command "_.fillet" (list (/ (+ (car pt1) (car pt2))2) (/ (+ (cadr pt1) (cadr pt2))2)) (list (/ (+ (car pt2) (car pt3))2) (/ (+ (cadr pt2) (cadr pt3))2)) "") et ainsi de suite dans le code. Tu peu aussi tenter tracer des lignes dont tu récupérera le nom avec un entlast. Il ne te restera plus qu'a faire des raccord entre les entités par leur nom.
-
test et questions de recrutement AutoCAD
alala a répondu à un(e) sujet de SteamRoller dans Emploi, monde du travail
Perso pour avoir fait passer quelques tests pour des emplois de dessinateurs "simple", je proposais de réaliser (ou reproduire) un dessin "simple" d'apparence mais qui comporte quelques exigences d'utilisation de l'outils qui me permettais de savoir ou en est l'utilisateur dans sa maitrise de celui-ci. Typiquement l'utilisation des textes multilignes, des hachures, des polylignes, voir même des blocs avec attributs n'est pas une évidence pour tous les dessinateurs qui se présentaient à ce type de poste. Je porte également une grande attention au comportement du candidat, les deux mains utilisés (comme au dessus), l’autonomie, mais aussi les questions posées et sa capacité à ne pas rester en plan devant un point de blocage (subtilement posé, dans l'exercice) sont des point qui me permettent de juger du comportement à venir (en gardant en tête que le candidat est dans une situation de stress car en entretien) . Enfin je n'exige pas que l'exercice soit finit (il n'a pas pour but de l'être), le temps de l'exercice est de 15 à 30 minutes maximum, je mets le candidat dans les conditions de travail, sans le stresser volontairement, mais sans le ménager non plus et je ne lui pose pas d'exercices qui sortent de son futur emplois de façon à ne pas lui faire peur ou miroité des choses. J'essais aussi, lors de l'entretiens de juger ses capacités à évoluer, quelqu'un avec 10 ou 15 ans d'expérience qui dit ne pas connaitre les scripts, personnellement ça m'interpelle, mais ce n'est pas rédhibitoire si le travail est bien fait. Soyons clair, pour moi ce genre d’exercice est bien plus un test de comportement face au travail qu’un réel test de compétences, j’ai pus déceler tellement de "rigolos" grâce à cela que si je devais en refaire aujourd’hui je n’hésiterais pas un instant. Par contre le candidat est toujours avertis au préalable de ce genre de test (et du temps nécessaire à lui consacrer), j’ai subit une fois un exercice de ce type à l’embauche sans que j’en sois avertis et même si tout c’est bien passé j’en garde un mauvais souvenir, surtout que celui-ci a durer deux heures et venais en plus d’un entretiens d’une heure. Une après midi de bouffé pour un poste en intérim d’une semaine c’est ridicule. Enfin tout cela dépend grandement des exigences de chacun, du travail à réaliser et de l'environnement de travail, je vois mal un entretien bien décontracté pour un poste à stress intense, ou l'inverse. -
Effectivement vos deux observations sont pertinantes, j'ai fait ça un peu trop "à l'arrache" et a force de modifications et de bidouillages j'en arrive à un code vraiment mauvais. La proposition de (gile) du second post est effectivement au plus juste, mon choix de passer par un parametre est antérieur à tout ce sujet, quand je me posais la question de mettre un point sur chaque sommet puis diviser les sections en nombre de points, ce que je n'ais pas fait et qui a plombé mon code ensuite. je confirme donc qu'avec ce code chez moi cela fonctionne à la perfection : (defun PPPoly ( / Adoc ss1 pl par pointpar distpar mspace) ;Points sur les objets linéaires (vl-load-com) (setq Adoc (vla-get-ActiveDocument (vlax-get-acad-object))) ;le document actif (setq mspace (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))) ;l'espace papier (setq ss1 (ssget "_C" (getvar "extmin") (getvar "extmax") '( (-4 . "<OR") (0 . "LWPOLYLINE,LINE,SPLINE,ARC") (-4 . "<AND") (0 . "POLYLINE") (-4 . "<NOT") (-4 . "&") (70 . 112) (-4 . "NOT>") (-4 . "AND>") (-4 . "OR>") (410 . "MODEL") );on filtre ) ) (vlax-for pl (setq ss1 (vla-get-ActiveSelectionSet Adoc));pour tous les objets dans la sélection (progn (setq distpar (vlax-curve-getDistAtParam pl (vlax-curve-getEndParam pl)));longueur de la courbe (while (< 0. distpar) ; tant qu'on est sur l'objet (setq pointpar (vlax-curve-getPointAtDist pl distpar)) (vla-addPoint mspace (vlax-3d-point (list (car pointpar) (cadr pointpar) 10.)));on met un point à la distance (setq distpar (1- distpar));distance moins 1m ) (setq pointpar (vlax-curve-getStartPoint pl)) (vla-addPoint mspace (vlax-3d-point (list (car pointpar) (cadr pointpar) 10.)));point au debut de la courbe ) ) (vla-delete ss1) ) Et qu'en plus de cela c'est bien plus rapide que le code de la boucle sur "_.measure". Me reste a retranscrire les maillages polyface et tout sera parfait! Merci beaucoup à vous tous.
-
J'avoue que la la fonction logand me dépasse un peu pour le moment! Mais tout ceci est très instructif! Pour en revenir a mon soucis j'en suis rendu à celle-ci: (defun PPPoly ( / Adoc ss1 pl par pointpar distpar mspace) ;Points sur les objets linéaires (vl-load-com) (setq Adoc (vla-get-ActiveDocument (vlax-get-acad-object))) ;le document actif (setq mspace (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))) ;l'espace papier (setq ss1 (ssget "_C" (getvar "extmin") (getvar "extmax") '( (-4 . "<OR") (0 . "ARC,LINE,LWPOLYLINE,SPLINE") (-4 . "<AND") (0 . "POLYLINE") (-4 . "<NOT") (-4 . "&") (70 . 112) (-4 . "NOT>") (-4 . "AND>") (-4 . "OR>") (410 . "MODEL") );on filtre ) ) (vlax-for pl (setq ss1 (vla-get-ActiveSelectionSet Adoc)) ;pour tous les objets dans la sélection (progn (setq par (vlax-curve-getEndParam pl)) ;fin de l'objet (setq distpar(vlax-curve-getDistAtParam pl par)) ;distance du param sur la ligne (while (<= 0 par) ; tan qu'on est sur l'objet (setq pointpar (vlax-curve-getPointAtParam pl par)) ;point du param de la ligne (if pointpar (progn (setq par (vlax-curve-getParamAtDist pl (setq distpar (- distpar 1)))) ;parametre de la nouvelle distance (vla-addPoint mspace (vlax-3d-point (list (car pointpar) (cadr pointpar) 10.0))) ;on met un point à la distance ) (setq par 0) ) ) (setq pointpar (vlax-curve-getStartPoint pl)) (vla-addPoint mspace (vlax-3d-point (list (car pointpar) (cadr pointpar) 10.0))) ;point au debut de la courbe ) ) (vla-delete ss1) ) Avec ce code si je filtre comme tel ça ne fonctionne pas (sorte de boucle infinie). Si je fitre LINE,LWPOLYLINE ça fonctionne vite. Si je filtre avec ARC ou SPLINE en plus ça entre dans une sorte de boucle infinie. Avez vous une info ou une "astuce" la dessus?
-
Et bien merci beaucoup pour cette explication! C'est beaucoup plus clair pour moi maintenant.
-
Etrangement si je fait une recherche sur un 112 je n'ai rien par contre sur un 64 oui. Ne faudrait il pas faire une recherche sur chacun des cas possibles (lourd?)
-
Effectivement j'ai supprimé le XLINE et un des deux POLYLINE (et j'aurais dut supprimer le second aussi, je corrige cela). Il semble que les maillages polyface posent problème. (POLYLIGNE avec un argument 70 à 64 et non 112 comme indiqué au dessus, ou alors j'ai raté un truc dans l'aide) Je vais donc m'attacher à les convertir avant traitement. Merci pour toute cette aide!
-
Merci pour les infos. Je vais déjà corriger les erreurs de type (recup d'une requette Map pour me simplifier la vie, au final c'est surrement la mon soucis). Pour le reste j'utilise beaucoup de verifications pour éviter les retours nil que j'avais sur certains objets. Et j'utilise beaucoup de variables pour me simplifier la lecture du code (étant grand débutant). lecrabe > le code s'utilise tel que même si il fait partis d'un plus gros morceau pour moi (point sur les cercles, sur les blocs, tracé d'une emprise covadis, ...).
-
Bonjour, continuant mon apprntissage du Lisp et Vlisp grâce à ce forum je tombe auojourd'hui sur un soucis de lenteur (voir de blocage). En effet, tentant de reproduite la commande measure (dans le but d'accélerer celle-ci et de ne plus avoir les messages d'erreurs des objet "trop cours" et de ne paire que ce dont j'ai besoin) j'ai tenter de remplacer ceci : (defun PPPoly ( / ss nb i NumEnt) ;Points sur les objets linéaires (setq ss (ssget "_C" (getvar "extmin") (getvar "extmax") '((0 . "2DPOLYLINE,3DPOLYLINE,ARC,LINE,LWPOLYLINE,MLINE,SPLINE,XLINE")(410 . "MODEL")))) ;on filtre ;(command "-calque" "g" "*" "") (setq nb (sslength ss)) ;on compte le nombre d'ojets sélectionnés (setq i 0) (while (< i nb) ; tan que l'on a pas fait tous les objets (command "_.measure" (ssname ss i) 1) ;(command "_.erase" (ssname ss i) "") (setq i (1+ i)) ) (princ) ) par ceci : (defun PPPoly ( / Adoc ss1 pl par pointpar distpar mspace) ;Points sur les objets linéaires (vl-load-com) (setq Adoc (vla-get-ActiveDocument (vlax-get-acad-object))) ;le document actif (setq mspace (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))) ;l'espace papier (setq ss1 (ssget "_C" (getvar "extmin") (getvar "extmax") '((0 . "2DPOLYLINE,3DPOLYLINE,ARC,LINE,LWPOLYLINE,MLINE,SPLINE,XLINE")(410 . "MODEL")))) ;on filtre (vlax-for pl (setq ss1 (vla-get-ActiveSelectionSet Adoc)) ;pour tous les objets dans la sélection (progn (setq par (vlax-curve-getEndParam pl)) ;fin de l'objet (setq distpar(vlax-curve-getDistAtParam pl par)) ;distance du param sur la ligne (while (<= 0 par) ; tan qu'on est sur l'objet (setq pointpar (vlax-curve-getPointAtParam pl par)) ;point du param de la ligne (if pointpar (progn (if pointpar (progn (setq pointpar (list (car pointpar) (cadr pointpar) 10.0)) ;def du point à x,y,10 (vla-addPoint mspace (vlax-3d-point pointpar)) ;on met un point à la distance ) ) ) ) (setq distpar (- distpar 1)) ;distance moins 1m (setq par (vlax-curve-getParamAtDist pl distpar)) ;parametre de la nouvelle distance ) (if (vlax-curve-getPointAtParam pl 0) (progn (setq pointpar (vlax-curve-getPointAtParam pl 0)) (setq pointpar (list (car pointpar) (cadr pointpar) 10.0));def du point à x,y,10 (vla-addPoint mspace (vlax-3d-point pointpar)) ;point au debut de la courbe ) ) ) ) (vla-delete ss1) ) Et je tombe donc sur certains fichier sur une grande lenteur, voir un blocage de l'execution (qui laisse penser à une boucle infini) dont je n'arrive pas à comprendre la source. Je pensait le Vlisp plus rapide, surtout pour sa capacité à éviter de passer des commandes à Autocad, je m'étonne donc de ce résultat. Constatez vous des problèmes dans mon code, et avez vous des solutions? Merci d'avance.
-
LISP - Calcul de distance entre blocs
alala a répondu à un(e) sujet de zebzeb dans LISP et Visual LISP
Oups l'erreur de not qui est un héritage de toute une routine modifié un paquet de fois! Il faut donc modifier cela. Pour la seconde remarque si je fait cela sur un de mes plans je n'obtiens pas le même résultat entre les deux solution. Et pourtant je suis en SCG.
