Aller au contenu

Pline + insert block avec Surf. et Périm.


Messages recommandés

Posté(e)

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

Posté(e)

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'...

Posté(e)

Salut

 

(setq jspoly (car (entlast)))

Quand tu regardes certaines fonctions, regarde les valeurs qui sont retournées

Si 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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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

Posté(e)

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

Posté(e)

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

Posté(e)

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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

Posté(e)

Ben oui

Tu 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 applicables

Par exemple, un (vlax-invoke mon_bloc 'getattributes) pour avoir la liste des attributs du bloc sélectionné

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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

Posté(e)

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

Posté(e)

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 çà...

Posté(e)

Voici le code

(command "_insert" "Blk_Piece.dwg" (getpoint) 1 1 0 Surf Peri "") ;insertion du block

Mais çà 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"

Posté(e)

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

Posté(e)

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

Posté(e)

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 à 0

Tu 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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • 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é