Aller au contenu

Bloc avec champ dynamique


(gile)

Messages recommandés

Comme il semble qu'en ce moment il y ait plusieurs membres qui cherchent à faire des routines pour insérer un bloc ou un champ dynamique lié à un objet pour indiquer une surface ou un périmètre, je propose, à titre d'exemple un petit LISP qui insère un bloc contenenant trois attributs dont deux champs dynamiques (longueur et aire). Chacun pourra le modifier suivant ses besoins.

 

En l'état le LISP fonctionne avec un bloc qui doit exister dans la collection du dessin courant (ou dans le gabarit ayant servi à sa création) ou être un fichier .dwg créé avec la commande wbloc et enregistré dans un dossier du chemin de recherche d'AutoCAD.

Le nom du bloc doit être : "Pline_block" ou "Pline_block.dwg" (wbloc)

Le bloc doit contenir 3 attributs : pièce, longueur et aire à sélectionner dans cet ordre lors de la création du bloc. Ces attributs seront renseignés via le LISP (donc inutile de spécifier une invite).

 

Le LISP invite à sélectionner une polyligne (ouverte ou fermée), à entrer le nom de la pièce (premier attribut) et à spécifier le point d'insertion.

 

;;; Pline_bloc -Gilles Chanteau- 04/09/06
;;; Insère le bloc "pline_block" après sélection d'une polyligne
;;; Attribut 1 : Nom de la pièce
;;; Attribut 2 : Longueur de la polyligne
;;; Attribut 3 : Aire de la polyligne

(defun c:pline_block (/ AcDoc Space bloc nom ent aire long ins)
 (setq	AcDoc (vla-get-ActiveDocument (vlax-get-acad-object))
Space (if (= (getvar "CVPORT") 1)
	(vla-get-PaperSpace AcDoc)
	(vla-get-ModelSpace AcDoc)
      )
 )
 (cond
   ((tblsearch "BLOCK" (setq bloc "Pline_block")))
   ((findfile (setq bloc "Pline_block.dwg")))
   (T (setq bloc nil))
 )
 (if bloc
   (progn
     (while (not (setq ent (car (entsel)))))
     (if (= (cdr (assoc 0 (entget ent))) "LWPOLYLINE")
(progn
  (setq	obj  (vlax-ename->vla-object ent)
	id   (vla-get-ObjectID obj)
	long (strcat "%			     (itoa id)
		     ">%).Length>%"
	     )
	aire (strcat "%			     (itoa id)
		     ">%).Area \\f \"%lu6%qf1\">%"
	     )
  )
  (initget 1)
  (setq nom (getstring T "\nNom de la pièce: "))
  (initget 1)
  (setq ins (trans (getpoint "\nPoint d'insertion: ") 1 0))
  (setq	ref
	 (vla-InsertBlock
	   Space
	   (vlax-3d-point ins)
	   bloc
	   1.0
	   1.0
	   1.0
	   0.0
	 )
  )
         (mapcar '(lambda (x y) (vla-put-TextString x y))
	  (vlax-invoke ref 'GetAttributes)
	  (list nom long aire)
	  )
  (vla-regen AcDoc acActiveViewport)
)
(alert "L'objet sélectionné n'est pas une polyligne.")
     )
   )
   (alert "Le bloc \"Pline_block\" est introuvable.")
 )
 (princ)
) 

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Gile,

 

Premier concerné, premier à s'exprimer !

 

Encore merci pour ton aide, je compile tes différents post pour comprendre l'envers du décor. La barre était placée un peu trop haut pour de simples novices en lisp et il fallait, je pense plusieurs heures de vol avant d'arriver à cette fin.

 

J'espère que ce précieux lisp servira à beaucoup de monde. La balle est dan snotre camp pour l'adapter à notre usage.

 

A très bientôt ! :) :)

"La ligne droite est le plus court chemin entre deux points, à condition que les deux points soient bien en face l'un de l'autre" P. Desproges.

Lien vers le commentaire
Partager sur d’autres sites

Bien (gile)

Il est possible d'améliorer ton lisp en associant le bloc concerné avec la polyligne par exemple et comme tu travailles avec les champs dynamiques, si on modifie une surface, le champ concerné sera remis à jour (avec un regen)

 

@+

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

Lien vers le commentaire
Partager sur d’autres sites

Et alors Patrick_35, on a un wagon de retard ? Hé hé :cool:

Tu es pardonné, tu dois être en train de nous concocter de nouvelles petites bombes...

 

Merci à tous les lispeurs, bougez pas j'arrive ! :P

"La ligne droite est le plus court chemin entre deux points, à condition que les deux points soient bien en face l'un de l'autre" P. Desproges.

Lien vers le commentaire
Partager sur d’autres sites

Et alors Patrick_35, on a un wagon de retard ? Hé hé :cool:

Eh oui, comme quoi il me reste encore des choses à découvrir sur Autocad ;) , mais j''ai une excuse, je viens d'avoir enfin une 2005 depuis peu qu'il me reste à approfondir :)

 

@+

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

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

J'essaie de modifier le lisp de gile pour qu'il n'y ai plus d'attribut "nom de pièce" ni "longueur de polyligne", je veux garder uniquement le champs aire. Je ne sais même pas par où commencer, je n'arrive même pas à trouver la hiérarchie des données... Je suis complètement paumé... J'ai plein de messages d'erreurs !

Si Gile pouvait me poster le lisp sans ces attributs ce serai sympa !

 

Merci d'avance !

"La ligne droite est le plus court chemin entre deux points, à condition que les deux points soient bien en face l'un de l'autre" P. Desproges.

Lien vers le commentaire
Partager sur d’autres sites

Bonsoir,

 

Voilà :

 

;;; Pline_bloc -Gilles Chanteau- 13/09/06
;;; Insère le bloc "pline_block" après sélection d'une polyligne
;;; Attribut 1 : Aire de la polyligne

(defun c:pline_block (/ AcDoc Space bloc nom ent aire long ins)
 (setq	AcDoc (vla-get-ActiveDocument (vlax-get-acad-object))
Space (if (= (getvar "CVPORT") 1)
	(vla-get-PaperSpace AcDoc)
	(vla-get-ModelSpace AcDoc)
      )
 )
 (cond
   ((tblsearch "BLOCK" (setq bloc "Pline_block")))
   ((findfile (setq bloc "Pline_block.dwg")))
   (T (setq bloc nil))
 )
 (if bloc
   (progn
     (while (not (setq ent (car (entsel)))))
     (if (= (cdr (assoc 0 (entget ent))) "LWPOLYLINE")
(progn
  (setq	obj  (vlax-ename->vla-object ent)
	id   (vla-get-ObjectID obj)
	aire (strcat "%			     (itoa id)
		     ">%).Area \\f \"%lu6%qf1\">%"
	     )
  )
  (initget 1)
  (setq ins (trans (getpoint "\nPoint d'insertion: ") 1 0))
  (setq	ref
	 (vla-InsertBlock
	   Space
	   (vlax-3d-point ins)
	   bloc
	   1.0
	   1.0
	   1.0
	   0.0
	 )
  )
  (vla-put-TextString (car (vlax-invoke ref 'GetAttributes)) aire)
  (vla-regen AcDoc acActiveViewport)
)
(alert "L'objet sélectionné n'est pas une polyligne.")
     )
   )
   (alert "Le bloc \"Pline_block\" est introuvable.")
 )
 (princ)
) 

 

[Edité le 13/9/2006 par (gile)]

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Bonsoir Gile !

 

Merci pour ta réponse rapide ! Entre temps j'ai composé une variante en VBA en traduisant en codes ASCII l'horrible chaîne de caractères du champs que VBA mettait en erreur...

 

Je t'avoue que j'ai énormément de mal avec le Lisp, surtout à cause du manque de temps...

 

Ceci dit, je suis tombé sur tes premiers messages, tes premiers pas ! hé hé ! Du coup je me sens moins seul :)

 

Encore merci.

"La ligne droite est le plus court chemin entre deux points, à condition que les deux points soient bien en face l'un de l'autre" P. Desproges.

Lien vers le commentaire
Partager sur d’autres sites

Pour Jalna et ceux qui veulent afficher l'aire de la polyligne dans une unité différente de l'unité choisie pour dessiner.

 

Dans l'exemple suivant l'unité de dessin est le centimètre, l'unité pour le champ est le m².

 

un suffixe est aussi ajouté : " m²"

 

Le bloc doit avoir ic 2 attributs : nom de la pièce et aire.

 

Chacun pourra adapter la routine à ces besoins en modifiant les parties [surligneur]surlignées[/surligneur].

 

;;; Pline_bloc -Gilles Chanteau- 13/09/06
;;; Insère le bloc "pline_block" après sélection d'une polyligne
;;; Attribut 1 : Nom de la pièce
;;; Attribut 2 : Aire de la polyligne

(defun c:pline_block (/ AcDoc Space bloc nom ent aire long ins)
 (setq	AcDoc (vla-get-ActiveDocument (vlax-get-acad-object))
Space (if (= (getvar "CVPORT") 1)
	(vla-get-PaperSpace AcDoc)
	(vla-get-ModelSpace AcDoc)
      )
 )
 (cond
   ((tblsearch "BLOCK" (setq bloc "Pline_block")))
   ((findfile (setq bloc "Pline_block.dwg")))
   (T (setq bloc nil))
 )
 (if bloc
   (progn
     (while (not (setq ent (car (entsel)))))
     (if (= (cdr (assoc 0 (entget ent))) "LWPOLYLINE")
(progn
  (setq	obj  (vlax-ename->vla-object ent)
	id   (vla-get-ObjectID obj)
	aire (strcat "%			     (itoa id)
		     ">%).Area \\f \"%lu2%pr2%ps[, [surligneur]m²[/surligneur]]%ct8[[surligneur]0.0001[/surligneur]]\">%"
	     )
  )
  (initget 1)
  (setq nom (getstring T "\nNom de la pièce: "))
  (initget 1)
  (setq ins (trans (getpoint "\nPoint d'insertion: ") 1 0))
  (setq	ref
	 (vla-InsertBlock
	   Space
	   (vlax-3d-point ins)
	   bloc
	   1.0
	   1.0
	   1.0
	   0.0
	 )
  )
         (mapcar '(lambda (x y) (vla-put-TextString x y))
	  (vlax-invoke ref 'GetAttributes)
	  (list nom aire)
	  )
  (vla-regen AcDoc acActiveViewport)
)
(alert "L'objet sélectionné n'est pas une polyligne.")
     )
   )
   (alert "Le bloc \"Pline_block\" est introuvable.")
 )
 (princ)
)

 

[Edité le 13/9/2006 par (gile)]

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Pour Jalna et ceux qui veulent afficher l'aire de la polyligne dans une unité différente de l'unité choisie pour dessiner.

 

Un grand MERCI (gile)

"Je suis fasciné par l'air. Si on enlevait l'air du ciel, tous les oiseaux tomberaient par terre... Et les avions aussi... En même temps l'air tu peux pas le toucher... Ca existe et ça existe pas... Ca nourrit l'homme sans qu'il ait faim... It's magic ! L'air c'est beau en même temps tu peux pas le voir, c'est doux et tu peux pas le toucher... L'air, c'est un peu comme mon cerveau..."

J-C Van Damme

Lien vers le commentaire
Partager sur d’autres sites

Tout bien réfléchi, l'idée du suffixe (m²) dans le champ, si elle peut paraître élégante, ne me semble pas si bonne (j'étais un peu fatigué hier soir).

Les champs ne seront plus interprétés comme des données numériques et les opérations avec ces champs dans un tableau (Excel ou AutoCAD) ne seront plus possibles.

Je pense qu'il est préférable de mettre le suffixe dans un attribut constant ou un objet texte du bloc, avec justification à droite pour l'attribut et le suffixe il est possible de faire quelque chose de présentable.

 

Pour supprimer le suffixe, remplacer :

 

">%).Area \\f \"%lu2%pr2%ps[, m²]%ct8[0.0001]\">%"

 

par

 

">%).Area \\f \"%lu2%pr2%ct8[0.0001]\">%"

 

Les parties %lu2 et %pr2 concernent les unités et le nombre de décimales, comme dans les variables LUNITS et LUPREC (à 2 toutes les deux dans l'exemple).

 

Il est aussi possible d'insérer le bloc suivant l'échelle globale des cotes courante (DIMSCALE) en remplaçant :

 

(setq ref
(vla-InsertBlock
Space
(vlax-3d-point ins)
bloc
1.0
1.0
1.0
0.0
)
) 

 

par :

 

(setq ref
(vla-InsertBlock
Space
(vlax-3d-point ins)
bloc
(getvar "DIMSCALE")
(getvar "DIMSCALE")
(getvar "DIMSCALE")
0.0
)
) 

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

  • 3 semaines après...

Bonsoir tous !

 

Le lisp, j'ai promis de m'y mettre... He bien j'y suis... Il y a un fossé entre ce que je sais faire et ce que je voudrai obtenir !

 

Ce message s'adresse à (Gile), je sais tu vas me trouver super lourd mais j'essaie de comprendre. J'ai repris ton lisp et j'essaie de le transformer pour qu'il opère sur 2 attributs : Le nom, le 2ème nom (Etiquette appelée "info") puis l'aire. Nous avons deux attributs normaux puis un dynamique...

 

Et j'arrive pas, j'ai tout analyser ligne par ligne et je ne sais pas où user du scalpel. J'ai fait des copier coller de ligne, j'ai imprimé les différents lisp que tu proposes sur du calque pour les comparer...

 

Juste si tu pouvais me mettre un petit rajout de rien du tout... STP ! Comme ça on saura comment faire pour 4 ou 5 attributs pour la suite !

 

Merci !

"La ligne droite est le plus court chemin entre deux points, à condition que les deux points soient bien en face l'un de l'autre" P. Desproges.

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

J'ai juste modifié le premier LISP (voir plus bas), j'ai supprimé l'attribut champ dynamique "périmètre" et ajouté un attribut "Deuxième nom" à spécifer par l'utilisateur.

 

J'ai aussi ajouté des commentaires.

 

Le bloc est d'abord inséré avec les valeurs d'attributs par défaut, puis ces valeurs sont remplacées par celles spécifiées par l'utilisateur ou le champ dynamique.

Ça se passe dans ces lignes de code :

 

(mapcar '(lambda (x y) (vla-put-TextString x y))
	  (vlax-invoke ref 'GetAttributes)
	  (list nom nom2 aire)
  ) 

Où (vlax-invoke ref 'GetAttributes) retourne la liste des valeurs par défaut et (list nom nom2 aire) la liste des nouvelles valeurs correspondantes.

 

Pour une meilleure lisibilité, je te conseille d'utiliser l'éditeur VisualLISP (menu Outils >> AutoLISP >> Editeur VisualLISP) et d'y "Formater la fenêtre d'édition". Je te laisses découvrir toutes les autre possibilités offertes par l'éditeur que je trouve fort utile.

 

http://img459.imageshack.us/img459/8453/vlispro0.png

 

 

;;; Pline_bloc -Gilles Chanteau- 29/09/06
;;; Insère le bloc "pline_block" après sélection d'une polyligne
;;; Attribut 1 : Nom de la pièce
;;; Attribut 2 : Deuxième nom
;;; Attribut 3 : Aire de la polyligne

(defun c:pline_block (/ AcDoc Space bloc nom ent aire nom2 ins)

 ;; Pointeurs vers le document actif et l'espace actif
 (setq	AcDoc (vla-get-ActiveDocument (vlax-get-acad-object))
Space (if (= (getvar "CVPORT") 1)
	(vla-get-PaperSpace AcDoc)
	(vla-get-ModelSpace AcDoc)
      )
 )

 ;; Recherche du bloc "pline_block" dans la collection,
 ;; puis dans les fichier du chemin de recherche
 (cond
   ((tblsearch "BLOCK" (setq bloc "Pline_block")))
   ((findfile (setq bloc "Pline_block.dwg")))
   (T (setq bloc nil))
 )

 (if bloc

   ;; Si le bloc a été trouvé
   (progn

     ;; Sélection d'une entité
     (while (not (setq ent (car (entsel)))))

     (if (= (cdr (assoc 0 (entget ent))) "LWPOLYLINE")

;; Si l'entité sélectionnée est bien une polyligne
(progn

  ;; Traduction de l'entité en objet-vla
  ;; ID de l'objet
  ;; Champ "aire" -troisième attribut-
  (setq	obj  (vlax-ename->vla-object ent)
	id   (vla-get-ObjectID obj)
	aire (strcat "%			     (itoa id)
		     ">%).Area \\f \"%lu6%qf1\">%"
	     )
  )

  ;; Entrée du nom -premier attribut-
  (initget 1)
  (setq nom (getstring T "\nNom de la pièce: "))

  ;; Entrée du 2ème nom -second attribut-
  (initget 1)
  (setq nom2 (getstring T "\nDeuxiéme nom: "))

  ;; Point d'insertion
  (initget 1)
  (setq ins (trans (getpoint "\nPoint d'insertion: ") 1 0))

  ;; Insertion du bloc
  (setq	ref
	 (vla-InsertBlock
	   Space
	   (vlax-3d-point ins)
	   bloc
	   1.0
	   1.0
	   1.0
	   0.0
	 )
  )

  ;; Remplacement des valeurs d'attributs par défaut par celles spécifiées
  (mapcar '(lambda (x y) (vla-put-TextString x y))
	  (vlax-invoke ref 'GetAttributes)
	  (list nom nom2 aire)
  )

  ;; Régénération de la fenêtre active
  (vla-regen AcDoc acActiveViewport)
)

;; Si l'entité sélectionnée n'est pas une polyligne
(alert "L'objet sélectionné n'est pas une polyligne.")
     )
   )

   ;; Si le bloc n'a pas été trouvé
   (alert "Le bloc \"Pline_block\" est introuvable.")
 )
 (princ)
) 

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Bonjour !

 

Encore mille mercis ! Nous y voyons plus clair maintenant, surtout moi...

Le lisp m'apparaît assez hermétique et sans une aide "sur mesure" je n'aurais jamais accroché. Maintenant que j'ai un outil pour extraire des attributs de surfaces bien "renseignés" je vais pouvoir bien avancer au travail ,et, du coup, me pencher un peu plus dans l'études du lisp et VBA.

 

Il me reste plus qu'à pister les lignes avec l'aide ouverte et comprendre les subtilités :

 

VLA

VLAX

VLA-GET-

 

etc...

 

Jusqu'à présent j'utilisais le bloc-note pour éditer, je passerai par l'éditeur dorénavant.

 

C ya !

"La ligne droite est le plus court chemin entre deux points, à condition que les deux points soient bien en face l'un de l'autre" P. Desproges.

Lien vers le commentaire
Partager sur d’autres sites

Certains esprits grincheux (ou peut être jaloux) prétendent que LISP signifie

[surligneur] L[/surligneur]ot of [surligneur] I[/surligneur]nutile ans [surligneur] S[/surligneur]tupid [surligneur] P[/surligneur]arenthesis.

Je le pratique depuis la version 2.18 d'autoCAD (sur HP 150 écran monochrome 11 pouces)

je prétends moi qu'il n'y a pas plus rapide pour développer sur autoCAD

Certes, c'est un langage interprété, normalement moins rapide en exécution que le C

mais s'il m'est arrivé de porter quelques routines critiques en temps en C++ (2 en fait) , les maquettes en LISP représentaient entre 5 et 10 fois moins de lignes de code.

quand tu auras un peu d'expérience, tu tomberas à genoux devant la puissance de fonctions comme (MAPCAR

Et puis les machines sont maintenant si performantes que la lenteur du code...... et le nouveau C# proné par autodesk est finalement un langage semi interprété.

 

Certes, enfin, le code de Gilles utilise beaucoup les fonctions VLA et, je reconnais qu'en débutant... mais tu t' y feras, j'en suis sûr.

 

quant à l'éditeur VLISP, il est INDISPENSABLE notamment pour débuguer et pour suivre une action.

Bon courage

Lien vers le commentaire
Partager sur d’autres sites

Merci pour ton soutien Didier-AD,

 

C'est vrai que j'ai plus facilement tendance à me tourner vars le VBA car la syntaxe me paraît plus familière, mais même en VBA j'ai quelques soucis !

 

Mon problème est que je me pose des objectifs un peu trop élevés par rapport au (peu) de temps qui m'est alloué pour la prog.

 

C'est vrai qu'une petite routine commentée comme l'a fait (Gile) est une mine d'or !

 

Mais bon, il paraît que Rome ne s'est pas faite en un jour...

 

 

A très bientôt !

"La ligne droite est le plus court chemin entre deux points, à condition que les deux points soient bien en face l'un de l'autre" P. Desproges.

Lien vers le commentaire
Partager sur d’autres sites

Une petite dernière, un seul et même point à spécifier à l'intérieur de la polyligne pour sa sélection et l'insertion du bloc. Les routines SelPlineByPoint et SelByObj doivent être chargées.

 

(defun c:pline_block (/ AcDoc Space bloc nom ent aire ech long ins)
 (setq	AcDoc (vla-get-ActiveDocument (vlax-get-acad-object))
Space (if (= (getvar "CVPORT") 1)
	(vla-get-PaperSpace AcDoc)
	(vla-get-ModelSpace AcDoc)
      )
 )
 (cond
   ((tblsearch "BLOCK" (setq bloc "Pline_block")))
   ((findfile (setq bloc "Pline_block.dwg")))
   (T (setq bloc nil))
 )
 (if bloc
   (progn
  (initget 1)
  (setq nom (getstring T "\nNom de la pièce: "))
  (initget 1)
  (setq ins (trans (getpoint "\nPoint d'insertion (à l'intérieur de la polyligne): ") 1 0))
     (setq ent (SelPlineByPoint ins))
     (if (= (type ent) 'ENAME)
(progn
  (setq	obj  (vlax-ename->vla-object ent)
	id   (vla-get-ObjectID obj)
	;; Attribut périmètre (cm -> m)
	long (strcat "%			     (itoa id)
		     ">%).Length \\f \"%lu2%pr2%ct8[0.01]\">%"
	     )
	;; Attribut surface (cm² -> m²)
	aire (strcat "%			     (itoa id)
		     ">%).Area \\f \"%lu2%pr2%ct8[0.0001]\">%"
	     )
	ech (getvar "DIMSCALE")
  )
  (setq	ref
	 (vla-InsertBlock
	   Space
	   (vlax-3d-point ins)
	   bloc
	   ech
	   ech
	   ech
	   0.0
	 )
  )
         (mapcar '(lambda (x y) (vla-put-TextString x y))
	  (vlax-invoke ref 'GetAttributes)
	  (list nom long aire)
	  )
  (vla-regen AcDoc acActiveViewport)
)
(alert "Aucune polyligne trouvée.")
     )
   )
   (alert "Le bloc \"Pline_block\" est introuvable.")
 )
 (princ)
) 

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

  • 3 semaines après...

Comment faire la meme chose avec le perimetre?

Merci d'avance

 

 

Pour Jalna et ceux qui veulent afficher l'aire de la polyligne dans une unité différente de l'unité choisie pour dessiner.

 

Dans l'exemple suivant l'unité de dessin est le centimètre, l'unité pour le champ est le m².

 

un suffixe est aussi ajouté : " m²"

 

Le bloc doit avoir ic 2 attributs : nom de la pièce et aire.

 

Chacun pourra adapter la routine à ces besoins en modifiant les parties [surligneur]surlignées[/surligneur].

 

;;; Pline_bloc -Gilles Chanteau- 13/09/06
;;; Insère le bloc "pline_block" après sélection d'une polyligne
;;; Attribut 1 : Nom de la pièce
;;; Attribut 2 : Aire de la polyligne

(defun c:pline_block (/ AcDoc Space bloc nom ent aire long ins)
 (setq	AcDoc (vla-get-ActiveDocument (vlax-get-acad-object))
Space (if (= (getvar "CVPORT") 1)
	(vla-get-PaperSpace AcDoc)
	(vla-get-ModelSpace AcDoc)
      )
 )
 (cond
   ((tblsearch "BLOCK" (setq bloc "Pline_block")))
   ((findfile (setq bloc "Pline_block.dwg")))
   (T (setq bloc nil))
 )
 (if bloc
   (progn
     (while (not (setq ent (car (entsel)))))
     (if (= (cdr (assoc 0 (entget ent))) "LWPOLYLINE")
(progn
  (setq	obj  (vlax-ename->vla-object ent)
	id   (vla-get-ObjectID obj)
	aire (strcat "%<\\AcObjProp Object(%<\\_ObjId "
		     (itoa id)
		     ">%).Area \\f \"%lu2%pr2%ps[, [surligneur]m²[/surligneur]]%ct8[[surligneur]0.0001[/surligneur]]\">%"
	     )
  )
  (initget 1)
  (setq nom (getstring T "\nNom de la pièce: "))
  (initget 1)
  (setq ins (trans (getpoint "\nPoint d'insertion: ") 1 0))
  (setq	ref
	 (vla-InsertBlock
	   Space
	   (vlax-3d-point ins)
	   bloc
	   1.0
	   1.0
	   1.0
	   0.0
	 )
  )
         (mapcar '(lambda (x y) (vla-put-TextString x y))
	  (vlax-invoke ref 'GetAttributes)
	  (list nom aire)
	  )
  (vla-regen AcDoc acActiveViewport)
)
(alert "L'objet sélectionné n'est pas une polyligne.")
     )
   )
   (alert "Le bloc \"Pline_block\" est introuvable.")
 )
 (princ)
)

 

[Edité le 13/9/2006 par (gile)]

Lien vers le commentaire
Partager sur d’autres sites

J'ai peut-être mal compris la demande.

 

La syntaxe pour un champ "Longueur" avec options :

 

(strcat "%(itoa id)
">%).Length \\f \"%lu2%pr2%ps[Périmètre : , m]%ct8[0.01]\">%"
) 

 

Les options pour les champs sont entre les guillemets précédés de \\f :

\\f \"%lu2%pr2%ps[Périmètre : , m]%ct8[0.01]\"

 

%lu2 : type d'unités de longueur (2 pour type décimal, comme pour LUNITS)

 

%pr2 : nombre de décimales (ici 2, comme LUPERC)

 

%ps[Périmètre : , m] : préfixe et suffixe (si seulement suffixe : [, m])

 

%ct8[0.01] : facteur de conversion (ici 0.01 pour cm -> m)

 

[Edité le 9/11/2006 par (gile)]

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

  • 3 ans après...

salut ,

encore bravo pour le lisp pline_block que j'ai adapté a mes besoin.

je cherche maintenant un moyen pour lier le block dynamique "pline_block" déja inseré et renseigné a une autre polyligne.

 

je m'explique

- avec la commande "pedit" je perd bcp de temps a modifierles sommets de mes poly.

- si j'insere un nouveau block et je le lie a une nouvelle poly,je perd bcp de temps pour reinseigné encore une foi mes etiquettes.

Ça serait merveilleux si on peut lier notre block déja reinseigné à une autre polyline.

 

bonne journée a tous

Lien vers le commentaire
Partager sur d’autres sites

  • 12 ans après...

@(gile)Au moment de lancer le LISP j'ai une erreur.

 

"Commande: APPLOAD
Pline_block (bloc avec nom aire perimetre dynamique = selection polyligne).lsp correctement chargé(s)
Commande: ; erreur: placement incorrect d'un point en entrée
Commande:
Commande:
**** Variable système modifiée ****
2 des variables système gérées ont été modifiées par rapport à la valeur préférée. Utilisez la commande MONITEURVARSYS pour afficher les modifications.
Enregistrement automatique vers C:\Users\DRAULT\appdata\local\temp\DCE_14BOI_PLN_1_8293_1908.sv$ ...
Commande:
**** Variable système modifiée ****
1 des variables système gérées a été modifiée par rapport à la valeur préférée. Utilisez la commande MONITEURVARSYS pour afficher les modifications."

Lien vers le commentaire
Partager sur d’autres sites

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é