-
Compteur de contenus
6 374 -
Inscription
-
Dernière visite
-
Jours gagnés
30
Type de contenu
Profils
Forums
Calendrier
Blogs
Tout ce qui a été posté par Patrick_35
-
[Résolu] Comment accéder à un objet d'un bloc
Patrick_35 a répondu à un(e) sujet de fabcad dans Pour aller plus loin en LISP
Salut Tramber Tu peux accéder directement au bloc sans utiliser de boucle En reprennant tes variables (vla-item *blocks* "Mon_Bloc") Et si tu as peur qu'il n'existe pas, avec une gestion d'erreur (vl-catch-all-error-p (vl-catch-all-apply 'vla-item (list *blocks* "Mon_Bloc"))) Ou encore plus simple, en utilisant (nentsel) sur un bloc visible à l'écran @+ -
[Résolu] Remplacement massif de bloc A$C....
Patrick_35 a répondu à un(e) sujet de tazofparis dans AutoCAD 2012
Version avec le choix du bloc de base (defun c:dca(/ bl def doc ent lst new pro tab sel nom_bl) (defun nom_bl(bl) (if (vlax-property-available-p bl 'effectivename) (vla-get-effectivename bl) (vla-get-name bl) ) ) (vl-load-com) (setq doc (vla-get-activedocument (vlax-get-acad-object))) (vla-startundomark doc) (princ "\nSélectionnez le bloc de base : ") (and (setq bl (ssget ":E:S" (list (cons 0 "insert") (cons 66 1)))) (princ "\nSélectionnez les blocs auxquels ajouter les attributs : ") (ssget (list (cons 0 "insert"))) (progn (setq bl (vlax-ename->vla-object (ssname bl 0)) bl (vla-item (vla-get-blocks doc) (nom_bl bl)) ) (vlax-for ent bl (and (eq (vla-get-objectname ent) "AcDbAttributeDefinition") (setq lst (cons ent lst)) ) ) (vlax-for ent (setq sel (vla-get-activeselectionset doc)) (or (member (nom_bl ent) tab) (progn (setq bl (vla-item (vla-get-blocks doc) (nom_bl ent))) (foreach def (reverse lst) (setq new (vla-addattribute bl (vla-get-height def) (vla-get-mode def) (vla-get-promptstring def) (vla-get-insertionpoint def) (vla-get-tagstring def) (vla-get-textstring def) ) ) (foreach pro '( 'alignment 'backward 'color 'constant 'fieldlength 'invisible 'layer 'linetype 'linetypescale 'lineweight 'lockposition 'material 'mtextattribute 'mtextattributecontent 'normal 'obliqueangle 'preset 'rotation 'scalefactor 'stylename 'textalignmentpoint 'thickness 'upsidedown 'verify 'visible) (and (vlax-property-available-p new (eval pro)) (vl-catch-all-apply 'vlax-put (list new (eval pro) (vlax-get def (eval pro)))) ) ) ) (setq tab (cons (nom_bl ent) tab)) (vl-cmdf "_.attsync" "_name" (nom_bl bl)) ) ) ) (vla-delete sel) ) ) (vla-endundomark doc) (princ) ) Version avec le nom du bloc de base renseigné dans le lisp (évite une sélection) (defun c:dca(/ bl def doc ent lst new pro tab sel nom_bl) (defun nom_bl(bl) (if (vlax-property-available-p bl 'effectivename) (vla-get-effectivename bl) (vla-get-name bl) ) ) (vl-load-com) (setq doc (vla-get-activedocument (vlax-get-acad-object))) (vla-startundomark doc) (princ "\nSélectionnez le bloc de base : ") (and (setq bl "LE_NOM_DU_BLOC_DE_BASE") (princ "\nSélectionnez les blocs auxquels ajouter les attributs : ") (ssget (list (cons 0 "insert"))) (progn (setq bl (vla-item (vla-get-blocks doc) bl) ) (vlax-for ent bl (and (eq (vla-get-objectname ent) "AcDbAttributeDefinition") (setq lst (cons ent lst)) ) ) (vlax-for ent (setq sel (vla-get-activeselectionset doc)) (or (member (nom_bl ent) tab) (progn (setq bl (vla-item (vla-get-blocks doc) (nom_bl ent))) (foreach def (reverse lst) (setq new (vla-addattribute bl (vla-get-height def) (vla-get-mode def) (vla-get-promptstring def) (vla-get-insertionpoint def) (vla-get-tagstring def) (vla-get-textstring def) ) ) (foreach pro '( 'alignment 'backward 'color 'constant 'fieldlength 'invisible 'layer 'linetype 'linetypescale 'lineweight 'lockposition 'material 'mtextattribute 'mtextattributecontent 'normal 'obliqueangle 'preset 'rotation 'scalefactor 'stylename 'textalignmentpoint 'thickness 'upsidedown 'verify 'visible) (and (vlax-property-available-p new (eval pro)) (vl-catch-all-apply 'vlax-put (list new (eval pro) (vlax-get def (eval pro)))) ) ) ) (setq tab (cons (nom_bl ent) tab)) (vl-cmdf "_.attsync" "_name" (nom_bl bl)) ) ) ) (vla-delete sel) ) ) (vla-endundomark doc) (princ) ) @+ -
[Résolu] Remplacement massif de bloc A$C....
Patrick_35 a répondu à un(e) sujet de tazofparis dans AutoCAD 2012
D'après ce que je vois, le lisp cpa copie l'étiquette (et non la valeur) d'un bloc vers d'autres blocs. Je ne comprends pas bien la question. Une recopie d'attributs ? Alors, utilise CAT @+ -
[Résolu] Remplacement massif de bloc A$C....
Patrick_35 a répondu à un(e) sujet de tazofparis dans AutoCAD 2012
Salut Un truc vite fait (defun c:nbl(/ doc ent sel incsuff) ;; INCSUFF (version 1.2) -Gilles Chanteau- 15/01/08 ;; Incrémente le suffixe d'une chaîne de caractères de la valeur spécifiée. ;; Est pris en compte comme suffixe, l'ensemble des caractères [0-9] et/ou [A-Z] ;; et/ou [a-z] depuis la fin du texte, en fonction de la valeur de alpha ;; ;; Arguments ;; str : une chaîne avec un suffixe valide ;; inc : un entier positif ;; alpha : un entier, somme des codes binaires suivant ;; 1 pour les caractères [0-9] ;; 2 pour les caractères [A-Z] ;; 4 pour les caractères [a-z] ;; ;; Retour ;; la chaîne avec son suffixe incrémenté (ou nil si aucun suffixe valide) ;; ;; Exemples : ;; (incsuff "N°002" 12 1) = "N°014" ;; (incsuff "Dessin9" 1 1) = "Dessin10" ;; (incsuff "test_ZZ9" 1 3) = "test_AAA0" ;; (incsuff "test_ZZ9" 1 1) = "test_ZZ10" ;; (incsuff "12-" 1 1) = nil ;; ;; Modification (13/02/08) : codes binaires pour l'argument alpha (defun incsuff (str inc alpha / lst crt pas ind dep quo ret) (setq lst (reverse (vl-string->list str))) (while (and (setq crt (car lst)) (cond ((and (< 47 crt 58) (= 1 (logand 1 alpha))) (setq pas 10 ind 48 ) ) ((and (< 64 crt 91) (= 2 (logand 2 alpha))) (setq pas 26 ind 65 ) ) ((and (< 96 crt 123) (= 4 (logand 4 alpha))) (setq pas 26 ind 97 ) ) ((< 0 quo) (setq crt (if (= 10 pas) ind (1- ind) ) lst (cons (car lst) lst) ) ) ) ) (setq dep (- crt ind) quo (/ (+ dep inc) pas) ret (cons (+ ind (rem (+ dep inc) pas)) ret) ) (if (zerop quo) (setq ret (append (reverse (cdr lst)) ret) lst nil ) (if (cdr lst) (setq lst (cdr lst) inc quo ) (setq lst (list ind) inc (if (= 10 pas) quo (1- quo) ) ) ) ) ) (if ret (vl-list->string ret) ) ) (vl-load-com) (and (setq txt (getstring T "\nEntrez la valeur de départ : ")) (ssget (list (cons 0 "insert" ))) (progn (setq doc (vla-get-activedocument (vlax-get-acad-object))) (vla-startundomark doc) (vlax-for ent (setq sel (vla-get-activeselectionset doc)) (while (tblsearch "block" txt) (setq txt (incsuff txt 1 7)) ) (vla-converttostaticblock ent txt) ) (vla-delete sel) (vla-endundomark doc) ) ) (princ) ) ps : pour le nom du bloc, "Test_009" donnera ensuite "Test_010". "Test9" donnera ensuite "Tesu0" @+ -
Salut A partir de ces lignes de codes (or (vl-catch-all-error-p (vl-catch-all-apply 'vla-put-configname (list lay imp))) (vla-refreshplotdeviceinfo lay) (setq lst (mapcar '(lambda (x) (vla-getlocalemedianame lay x)) (vlax-invoke lay 'getcanonicalmedianames))) ) Quand tu utilises cette fonction (vlax-invoke lay 'getcanonicalmedianames) Tu as tous les formats papier disponible du traceur (pc3 ou autres). C'est une de ces valeurs qu'il faut utiliser pour changer le format papier. Mais comme c'est quelque chose d'inutilisable pour le commun des mortels, la traduction se fait ainsi. Exemple pour traduire le 1er format de papier (vla-getlocalemedianame lay (nth 0 (vlax-invoke lay 'getcanonicalmedianames))) Et donc, pour appliquer le 1er format papier au traceur. (vla-put-CanonicalMediaName lay (nth 0 (vlax-invoke lay 'getcanonicalmedianames))) ps : pour avoir la progress bar du tracé, il faut utiliser (vlax-invoke mon_traceur 'plottodevice) que (vla-plottodevice mon_traceur) @+
-
D'après le wiki Mais connaissant les liens américano-israélien ;) @+
-
Salut Décidément, l'Iran a du mal avec les virus, comme avec Stuxnet qui avait pour but de détruire les centrifugeuses. Le plus fort, c'est que la centrale n'est reliée avec aucun réseau extérieur. Apparemment, une simple clé usb aurait suffit à contaminer le réseau de la centrale. A ce niveau là, je pense que ce ne sont plus des hackers qui font mumuse avec les virus, mais les états. Plus d'infos sur le wiki @+
-
Salut Tu peux faire un champ avec comme paramètres objet + visibilité1 de l'objet choisi. En cas de changement d'un état de visibilité d'un bloc, ne pas oublier de faire un regen ou la commande mettreajourchamp pour mettre à jour les attributs. @+
-
Salut Tu as aussi ce sujet @+
-
Alors une Traduction (defun c:altz(/ att bas doc ent lst pos pts sel nombl) ; Ici, on a une une fonction qui donne le nom du bloc, même ceux qui sont dynamiques. ; car si on regarde juste le nom du bloc dynamique, on a quelque chose dans ce style "*U304" ; Donc, c'est la propriété effectivename qu'il faut regarder si elle existe. (defun nombl(bl) (if (vlax-property-available-p bl 'effectivename) (vla-get-effectivename bl) (vla-get-name bl) ) ) ; Activation des fonctions activex (vl-load-com) ; On définit que l'on travail sur le document actif (le dessin actuel) (setq doc (vla-get-activedocument (vlax-get-acad-object))) ; On définit le début du undo, même style que (command "_.undo" "_group") (vla-startundomark doc) ; on fait un test avec la fonction And. ; Un and à la particularité de tester le 1er argument, si c'est ok on passe au suivant, etc... ; jusqu'à la fonction (ici le progn) ; On sélectionne un sous-objet avec la fonction nentsel (and (setq ent (nentsel)) ; On transforme la sélection en objet vla (setq att (vlax-ename->vla-object (car ent))) ; On regarde si c'est un attribut (eq (vla-get-objectname att) "AcDbAttribute") ; On détermine le père de l'attribut, c'est à dire le bloc qui contient ledit attribut sélectionné (setq bas (vla-objectidtoobject (vla-get-database att) (vla-get-ownerid att)) ; On recherche les attributs du bloc déterminé avant que l'on ajoute dans une liste lst (vlax-invoke bas 'getattributes) ; On calcul la position de l'attribut dans la liste définit auparavant pos (- (length lst) (length (member att lst))) ) ; on fait une sélection dans tout le dessin avec comme arguments ; que ce sont des blocs (cons 0 "insert") ; que l'on recherche les blocs anonymes (cons 2 "`**") ; que l'on recherche un bloc spécifique selon son nom (cons 2 (nombl bas)) ; et que pour que le filtre fonctionne, on regroupe les différents noms (cons 2 (strcat "`**," (nombl bas))) ; que l'on recherche des blocs avec attributs (cons 66 1) (ssget "x" (list (cons 0 "insert") (cons 2 (strcat "`**," (nombl bas))) (cons 66 1))) (progn ; on fait une boucle de recherche (vlax-for = foreach mais pour du vla) ; et sur la sélection active, donc de ssget (vla-get-activeselectionset doc) (vlax-for ent (setq sel (vla-get-activeselectionset doc)) ; Je vérifie que le bloc dans la boucle correspond bien au nom du bloc de base (and (eq (nombl bas) (nombl ent)) (progn ; Je récupère le point d'insertion (setq pts (vlax-get ent 'insertionpoint)) ; il faut lire la ligne de code à l'envers, en fonction de ses imbrications ; je regarde les attributs du bloc de ma boucle (vlax-invoke ent 'getattributes) ; je prends l'attribut qui m'intéresse en fonction de sa position dans la liste ; (nth pos (vlax-invoke ent 'getattributes)) ; je récupère la valeur de l'attribut que je transforme en réel ; (atof (vla-get-textstring (nth pos (vlax-invoke ent 'getattributes)))) ; Je construis une liste de point ; (list (car pts) (cadr pts) (atof (vla-get-textstring (nth pos (vlax-invoke ent 'getattributes))))) ; que j'écris comme position du bloc dans la boucle de recherche (vlax-put ent 'insertionpoint (list (car pts) (cadr pts) (atof (vla-get-textstring (nth pos (vlax-invoke ent 'getattributes)))))) ) ) ) (vla-delete sel) ; J'efface le jeu de sélection. A faire systématiquement car sinon, a un moment donné, le lisp plantera à cause de lui ; Pourquoi ? c'est la question à qui veux gagner des millions. ) ) ; On définit la fin du undo, même style que (command "_.undo" "_end") (vla-endundomark doc) ; Silence (princ) ) Maintenant, il n'y a plus qu'à ;) Avec un site comme dl.free.fr par exemple @+
-
Bon, une autre version dans laquelle tu cliques sur l'attribut concerné et le lisp fait le reste. (defun c:altz(/ att bas doc ent lsp pos pts sel nombl) (defun nombl(bl) (if (vlax-property-available-p bl 'effectivename) (vla-get-effectivename bl) (vla-get-name bl) ) ) (vl-load-com) (setq doc (vla-get-activedocument (vlax-get-acad-object))) (vla-startundomark doc) (and (setq ent (nentsel)) (setq att (vlax-ename->vla-object (car ent))) (eq (vla-get-objectname att) "AcDbAttribute") (setq bas (vla-objectidtoobject (vla-get-database att) (vla-get-ownerid att)) lst (vlax-invoke bas 'getattributes) pos (- (length lst) (length (member att lst))) ) (ssget "x" (list (cons 0 "insert") (cons 2 (strcat "`**," (nombl bas))) (cons 66 1))) (progn (vlax-for ent (setq sel (vla-get-activeselectionset doc)) (and (eq (nombl bas) (nombl ent)) (progn (setq pts (vlax-get ent 'insertionpoint)) (vlax-put ent 'insertionpoint (list (car pts) (cadr pts) (atof (vla-get-textstring (nth pos (vlax-invoke ent 'getattributes)))))) ) ) ) (vla-delete sel) ) ) (vla-endundomark doc) (princ) ) Reste à voir si cela pose problème avec ton bloc, et dans ce cas, donne nous un exemple pour comprendre Pas tant que ça ;) D'après ce que tu as mis sur le forum, ça fonctionne bien et c'est le principal :D Merci, cela permet de rendre service, un juste retour de l'aide que l'on peut recevoir ;) @+
-
Salut Un truc vite fait. Il faut juste modifier le nom du bloc dans le lisp et éventuellement la position de l'attribut Z (j'ai pris la 3em position --> nth 2) (defun c:altz(/ doc ent pts sel) (vl-load-com) (setq doc (vla-get-activedocument (vlax-get-acad-object))) (vla-startundomark doc) (and (ssget "x" (list (cons 0 "insert") (cons 2 "Le nom du bloc qui contient les attributs") (cons 66 1))) (progn (vlax-for ent (setq sel (vla-get-activeselectionset doc)) (setq pts (vlax-get ent 'insertionpoint)) (vlax-put ent 'insertionpoint (list (car pts) (cadr pts) (atof (vla-get-textstring (nth 2 (vlax-invoke ent 'getattributes)))))) ) (vla-delete sel) ) ) (vla-endundomark doc) (princ) ) @+
-
Quelle fonction utiliser pour des objets?
Patrick_35 a répondu à un(e) sujet de fiesta13310 dans Débuter en LISP
Salut Une astuce pour retrouver tous les objets qui ont été ajoutés. Après l'insertion d'un bloc, tu utilises (setq dernier (entlast)) pour retrouver le dernier objet de la base de données d'Autocad (en l'occurrence, l'objet inséré) Tu fais toutes tes manips, réseau, miroir, etc... et tu utilises la fonction lisp entnext sur la variable dernier pour retrouver le/les objets qui ont été ajoutés. Tu utilises autant de fois entnext qu'il y a d'objets ajoutés. Un entnext sur le dernier objet devra retourner nil. @+ -
Création d'un calque a partir des données d'un autre calque
Patrick_35 a répondu à un(e) sujet de Flamk dans Autodesk Map
Salut Je suis bien descendu de ma soucoupe mais je ne comprends pas ton message. Si tu pouvais nous fournir un exemple avant et le résultat final. @+ -
Quel héritage laisserons-nous à nos enfants ? Océan Pacifique à 2000 kms de toutes côtes. Sur cette île personne n'habite, il n'y a que des oiseaux et pourtant... Ouvrez ce lien : http://www.midwayfilm.com Un petit film de 3 minutes que tout le monde devrait voir et en tirer des conclusions. @+
-
Et j'ajoute quelques citations Inconnu Albert Einstein Coluche @+
-
Salut C'est ce que l'on appel de l'ingérence et de plus, les Japonais ont refusé l'aide française ainsi que l'aide internationale dans un premier temps lors de la catastrophe, par fierté sûrement. Mais que dire des sous marins russe qui pourrissent dans le port de Mourmansk ? du scandale de la mer d'Aral sans oublier Tchernobyl qui n'a pas encore fini de faire parler de lui ? Que dire encore de la pollution atmosphérique dans les pays émergents auquel nous contribuons indirectement et du fameux droit à polluer Je pense que l'on fait beaucoup de bruit en Europe pour l'écologie, qu'un geste est toujours mieux que rien, mais quand je regarde ce qui se passe ailleurs comme pour l'afrique, cela me laisse peu d'espoirs. Nous ne faisons qu'emprunter la planète à nos enfants. @+
-
Salut Regarde dans Options --> Fichiers --> Aide et divers noms de fichiers --> Fichier d'aide --> c:\.....\acad....chm @+
-
Salut Comme tu commences à faire du lisp, c'est maintenant qu'il faut songer à faire les choses carrés. Tu vas vite de rendre compte que cela facilite la vie du programmeur. Donc, pour en revenir à tes blocs, le plus simple est que tu redéfinies une bonne fois pour tout tes points de base et de faire une passe (via un script ou autre) sur tous tes dessins pour réinsérer correctement tes points de base. @+
-
LISP - Calcul de distance entre blocs
Patrick_35 a répondu à un(e) sujet de zebzeb dans LISP et Visual LISP
Salut Comme tu parcours tes attributs avec entnext, c'est pour ajouter une sécurité pour sortir de ta fonction. Le '(0 . SEQEND) est là pour indiquer que tous les attributs du bloc ont été trouvés et qu'il est temps de faire autre chose. Extrait de l'aide C'est pour éviter de sélectionner des lignes, des textes, etc... La sélection se fait uniquement sur les blocs (0 . "INSERT") et possédants des attributs (66 . 1) @+ -
Démarrer avec AutoCAD .NET
Patrick_35 a répondu à un(e) sujet de (gile) dans ObjectARX/DBX, C++, .NET, RealDWG
Salut Merci (gile) Comme le lien a l'air d'être incontournable, voici une version de sauvegarde au cas ou. @+ -
Ah oui, c'est exact. Je l'avais oublié celui-là ;) @+
-
Par exemple (defun c:essai (/ erreur) (defun *myerror*(msg) (or (member (strcase msg) '("FUNCTION CANCELLED" "QUIT / EXIT ABORT" "FONCTION ANNULEE" "QUITTER / SORTIR ABANDON")) (princ (strcat "\nErreur : " msg)) ) (setq *error* erreur) (princ) ) (setq erreur *error* *error* *myerror*) ; rediriger la gestion des erreurs vers sa propre routine (While (c:ncopy) (princ) (command "_laycur" "_last" "") (princ) ) (setq *error* erreur) ; rediriger la gestion des erreurs vers celle d'origine (princ) ) Mais il y a un souci avec la gestion des erreurs, car le résultat escompté n'est pas le bon. Comme c'est un lisp des express-tools avec sa propre gestion des erreurs, cela doit venir de là ou encore (defun c:essai() (vl-load-com) (while (not (vl-catch-all-error-p (vl-catch-all-apply 'c:ncopy))) (princ) (command "_laycur" "_last" "") (princ) ) ) Ici, il faut utiliser deux echap pour quitter la routine, et cela doit encore être du à la routine des express-tools
-
Salut Au plus simple, avec une boucle infinie (while ....) Et ensuite, pour peaufiner, avec une gestion d'erreurs @+
-
Une question sur les polylignes
Patrick_35 a répondu à un(e) sujet de coyotte dans ObjectARX/DBX, C++, .NET, RealDWG
Merci pour les encouragements :(rires forts): Plus sérieusement, avec quels outils gratuits conseil-tu pour commencer ?
