Dexter Posté(e) le 31 janvier 2012 Posté(e) le 31 janvier 2012 Bonjour à tous, Voilà,j'ai pas mal cherché dans les forums sans trouver ce que je voulais faire (trop complet ou trop compliqué)Mon problème : je dessine une polyligne de cette façon : (princ "\nTournez dans le sens horaire ! !") (command "_.pline" (while (not (zerop (getvar "cmdactive"))) (command pause)) ;_ Fin de while ) ;_ Fin de command Mais après, j'aimerai inserer un bloc (Blk_Piece.dwg) puis, mettre à jour l'attribut "SUP" pour SUPerficie et "PERI" pour PÉRImètre de cette polyligne. Les autres ne sont ques des variables que je maitrise (étage, escalier, ascenseur,...). Je n'ai pas besoin de réacteur... Les plans sont "figés" J'aimerai juste quelques petites lignes bien commentées pour bien les comprendre... Mon but final, c'est un listing complet des blocks "Blk_Piece" vers un fichier excel. Merci d'avance... Dexter...
Dexter Posté(e) le 31 janvier 2012 Auteur Posté(e) le 31 janvier 2012 Je cherche avec çà :(defun c:Mettre_Piece (/ Ech scl) (if (= (setq Ech (vlax-ldata-get "Phalene" "Ech1")) nil) ;_ Fin de = (c:PhEch)) ;(setq jspoly (ssadd)) (princ "\nTournez dans le sens horaire ! !") (command "_.pline" (while (not (zerop (getvar "cmdactive"))) (command pause)) ;_ Fin de while ) ;_ Fin de command (princ "--1") (setq jspoly (car (entlast))) (princ "--2") (princ (rtos (getvar "PERIMETER") 2 (getvar "luprec"))) ;_ Fin de if ) Mais la ligne avec jspoly (que j'ai piqué à un autre) me donne :; erreur: type d'argument incorrect: consp <Nom d'entité: 7c479868>je vais voir du côté de 'car'...
Patrick_35 Posté(e) le 1 février 2012 Posté(e) le 1 février 2012 Salut (setq jspoly (car (entlast)))Quand tu regardes certaines fonctions, regarde les valeurs qui sont retournéesSi tu fais (entlast) sur la ligne de commande, la valeur retournée est par exemple <Nom d'entité: 7430e6e8>, ce qui correspond à une entitéDonc un (entget (entlast)) devrait logiquement m'indiquer les codes dxf de ma poly @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Dexter Posté(e) le 1 février 2012 Auteur Posté(e) le 1 février 2012 Bonjour à tous,Merci Patrick_35, c'est pile poil... J'ai donc :(setq jspoly (entget (entlast))) (princ (rtos (getvar "area") 2 2)) Où jspoly contient les données DXF de ma polyligne...Me reste plus qu'à rechercher les distance pour en sortir le périmètre...Merci encore,Dexter...
VDH-Bruno Posté(e) le 1 février 2012 Posté(e) le 1 février 2012 Bonjour, Me reste plus qu'à rechercher les distance pour en sortir le périmètre...Pour une polyligne fait précéder l’interrogation des variables systèmes area & perimeter, par un appel à la commande _list pour l’entitée dont tu veux récupérer les données. Exemples pour la dernière entitée dessinée(command "_list" (entlast) "") (getvar 'area); renvoie la surface (getvar 'perimeter); renvoie le perimètre Ps : Avec un appel à (graphscr) tu supprimeras l’affichage en premier plan de la fenêtre de texte AutoCAD amené par l’appel à la commande _list A+ Apprendre => Prendre => Rendre
Dexter Posté(e) le 1 février 2012 Auteur Posté(e) le 1 février 2012 Bonjour, Waow... Merci VDH-Bruno, j'ai du boulo maintenant.Je posterai ma routineune fois que je saurais remplir les attribut du bloc avec Surf et Peri...Merci encore,Dexter...
Patrick_35 Posté(e) le 1 février 2012 Posté(e) le 1 février 2012 Salut D'une manière plus propre en autolisp(setq jspoly (vl-remove-if-not '(lambda(x)(eq (car x) 10)) (entget (entlast))) pt1 (car jspoly) lst (cdr jspoly) dist 0.0 ) (foreach pt2 lst (setq dist (+ dist (distance (cdr pt1) (cdr pt2))) pt1 pt2 ) ) (if (eq (logand (cdr (assoc 70 (entget (entlast)))) 1) 1) (setq dist (+ dist (distance (car jspoly) (last jspoly)))) ) (princ (strcat "\nLe périmètre est de : " (rtos dist))) Et plus simple en vlisp(princ (strcat "\nLe périmètre est de : " (rtos (vlax-get (vlax-ename->vla-object (entlast)) 'length)))) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Dexter Posté(e) le 1 février 2012 Auteur Posté(e) le 1 février 2012 Merci Patrick_35 Peut-on avoir aussi la surperficie avec çà ? (l'aide AutoCAD est en anglais et je n'en ai pas trouvé sur "vlax-get" seul et "vlax-ename->vla-object" ne me dit rien d'intéressant(princ (strcat "\nLa superficie est de : " (rtos (vlax-get (vlax-ename->vla-object (entlast)) 'area))))Merci encore...
Patrick_35 Posté(e) le 1 février 2012 Posté(e) le 1 février 2012 Ben ouiTu as trouvé tout seul, c'est bien :D Si tu veux connaitre plus de choses en vlisp sur ta poly, tu fais(vlax-dump-object (vlax-ename->vla-object (entlast)) T) ps : le T pour le vlax-dump-object sert à montrer les méthodes applicablesPar exemple, un (vlax-invoke mon_bloc 'getattributes) pour avoir la liste des attributs du bloc sélectionné @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Dexter Posté(e) le 1 février 2012 Auteur Posté(e) le 1 février 2012 Génial... Merci, Voici ma routine, pour l'instant :(defun c:Metre_Piece (/ Surf Peri) (princ "\nTournez dans le sens horaire ! !") (command "_.pline" (while (not (zerop (getvar "cmdactive"))) (command pause)) ;_ Fin de while ) ;_ Fin de command (princ (strcat "\nLe périmètre est de : " (rtos (vlax-get (vlax-ename->vla-object (entlast)) 'length))) ) ;_ Fin de princ (princ (strcat "\nLa superficie est de : " (rtos (vlax-get (vlax-ename->vla-object (entlast)) 'area))) ) ;_ Fin de princ ) Je n'ai plus qu'à remplir mon bloc pendant l'insertion... merci encore...
VDH-Bruno Posté(e) le 1 février 2012 Posté(e) le 1 février 2012 Salut, Pour faire plus propre et un clin d’œil à Patrick_35, la version avec command : ;) ((lambda (/ echo) (setq echo (getvar 'CMDECHO)) (setvar 'CMDECHO 0) (command "_area" "_o" (entlast)) (princ (strcat "\nLe périmètre est de : " (rtos (getvar 'PERIMETER)) "\nLa surface est de : " (rtos (getvar 'AREA)) ) ) (setvar 'CMDECHO echo) ) ) Note : L’appel à la commande _area par rapport à la commande _list offre un comportement plus généraliste à la fonction, elle ne limite plus l’initialisation des variables systèmes PERIMETER & AREA aux seules entitées polylignes. Dexter ta routine est très bien, si tu veux être puriste, tu peux simplifier l’appel aux fonctions princ & strcat, pense éventuellement à rajouter un appel à (vl-load-com) si tu n’es pas familier des fonctions vla- A+ Apprendre => Prendre => Rendre
Dexter Posté(e) le 1 février 2012 Auteur Posté(e) le 1 février 2012 Merci à tous, voici le début de ma routine :(defun c:Metre_Piece (/ Surf Peri) (setq echo (getvar 'CMDECHO)) ;Sauvegardede la variable CmdEcho (setvar 'CMDECHO 0); Attribution de sa nouvelle valeur (0=cache l'affichage) (princ "\nTournez dans le sens horaire ! !") ;pour des raison de compatibilité avec d'autres routines (command "_.pline" ;dessine une polyligne avec le curseur (while (not (zerop (getvar "cmdactive"))) (command pause)) ;_ Fin de while ) ;_ Fin de command (setq Surf (rtos (vlax-get (vlax-ename->vla-object (entlast)) 'area)) ;Aire de la Plign Peri (rtos (vlax-get (vlax-ename->vla-object (entlast)) 'length));Périmètre de la Plign ) (setvar 'CMDECHO echo) ; Redonne son ancienne valeur à CmdEcho )Pour la suite, je cherche encore...-inserer...Mais il m'affiche la fenêtre pour remplir les attributs...Merci encore à tous, bon, j'ai du encore boulo avec çà...
VDH-Bruno Posté(e) le 1 février 2012 Posté(e) le 1 février 2012 Bonsoir, (command "_insert" "nom-du-bloc" (getpoint) 1 1 0 Surf Peri "") A adapter suivant le nombre d'attribut à renseigner dans ton bloc.. Apprendre => Prendre => Rendre
Dexter Posté(e) le 1 février 2012 Auteur Posté(e) le 1 février 2012 Voici le code(command "_insert" "Blk_Piece.dwg" (getpoint) 1 1 0 Surf Peri "") ;insertion du blockMais çà ne fonctionne pas, il m'affiche la fenêtre "Entrer les attributs" dans laquelle j'en ai 8... Mais je cherche...Je pense qu'il doit il y avoir ce mot clef "GetAttributes"
Dexter Posté(e) le 1 février 2012 Auteur Posté(e) le 1 février 2012 Bonsoir à tous, J'ai trouvé différents truc et j'ai fais çà :(defun c:Metre_Piece (/ Surf Peri) (setq echo (getvar 'CMDECHO)) ;Sauvegardede la variable CmdEcho (setq attreq (getvar 'ATTREQ)) (setvar 'CMDECHO 0) ;Attribution de sa nouvelle valeur (0=cache l'affichage) (setvar 'ATTREQ 0) ;0=cache la fenetre "Entrer les attributs" (setvar "dimzin" 1) (princ "\nTournez dans le sens horaire ! !") ;pour des raison de compatibilité avec d'autres routines (command "_.pline" ;dessine une polyligne avec le curseur (while (not (zerop (getvar "cmdactive"))) (command pause)) ;_ Fin de while ) ;_ Fin de command (setq Surf (rtos (vlax-get (vlax-ename->vla-object (entlast)) 'area)) Peri (rtos (vlax-get (vlax-ename->vla-object (entlast)) 'length)) ) ;_ Fin de setq (command "_insert" "Blk_Piece.dwg" (getpoint) 1 1 0 Surf Peri "") ;insertion du block (vlax-dump-object (vlax-ename->vla-object (entlast)) T) (setvar 'CMDECHO echo) ;Redonne son ancienne valeur à CmdEcho (setvar 'ATTREQ attreq) ) ;_ Fin de defun Mais avec le "dump", je ne vois pas mes attributs. La liste doit être quelquepart...Je continue mes recherches...
Dexter Posté(e) le 2 février 2012 Auteur Posté(e) le 2 février 2012 J'ai enfin trouvé, ATTDIA ! !Voici mon code pour observations...Merci encore...J'ai commenté au maximum, pour moi et pour les débutants :(defun c:Metre_Piece (/ Surf Peri) (setq echo (getvar 'CMDECHO) ;Sauvegardede la variable CmdEcho attdia (getvar 'ATTDIA) ;attreq (getvar 'ATTREQ) ) ;_ Fin de setq (setvar 'CMDECHO 0) ;Attribution de sa nouvelle valeur (0=cache l'affichage) (setvar 'ATTDIA 0) ;0=invite de commande / 1=boites de dialogue ; (setvar 'ATTREQ 0) ;0=cache la fenetre "Entrer les attributs" (setvar "dimzin" 1) (princ "\nTournez dans le sens horaire ! !") ;pour des raison de compatibilité avec d'autres routines (command "_.pline" ;dessine une polyligne avec le curseur (while (not (zerop (getvar "cmdactive"))) (command pause) ) ;_ Fin de while ) ;_ Fin de command (setq Surf (rtos (vlax-get (vlax-ename->vla-object (entlast)) 'area ) ;_ Fin de vlax-get ) ;_ Fin de rtos Peri (rtos (vlax-get (vlax-ename->vla-object (entlast)) 'length ) ;_ Fin de vlax-get ) ;_ Fin de rtos ) ;_ Fin de setq (command "_insert" ;insertion du bloc "Blk_Piece.dwg" ;nom du bloc (getpoint) ;point d'insertion 1 ;X 1 ;Y 0 ;Z "" ;N° du lot "" ; Type de pièce "" ;Catégorie Surf ;Superficie Peri ;Périmètre "" ;Niveau "" ;Escalier "" ;Ascenseur "" ;Entrer ) (setvar 'CMDECHO echo) ;Redonne son ancienne valeur à CmdEcho (setvar 'ATTDIA attdia) ; (setvar 'ATTREQ attreq) ) ;_ Fin de defun Maintenant je vais exporter tous çà dans Excel.Bonne journée à tous et encore merci,Dexter...
Patrick_35 Posté(e) le 2 février 2012 Posté(e) le 2 février 2012 Eh bien, petit à petit l'oiseau fait son nid ;) Pour répondre à la question sur getattributes.Tu inséres le bloc avec la variable attreq à 0Tu fais ensuite(setq att (vlax-invoke (vlax-ename->vla-object (entlast)) 'getattributes)) Ensuite, un (nth 3 att) pour trouver l'attribut surface.Et pour lui indiquer la valeur, un(vlax-put (nth 3 att) 'textstring Surf) Pour voir toutes les données de l'attribut(vlax-dump-object (nth 3 att)) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant