Aller au contenu

programme se stoppe après (command \"_pline\")


Messages recommandés

Posté(e)

Bonsoir,

 

Je suis entrain de faire un petit programme, mais je bloque....(eh oui je ne suis qu'un novice) mais j'aimerai comprendre ce phénomène

 

Donc voici le code:

(defun c:test ()

(setq DIAMETRE_INT (getreal "Indiquer le diamètre de la canalisation: "))
(setq VISIBILITE_INT (getstring "Indiquer le type de visibilité C ou O: "))
(command "_-layer" "CH" "SME_RESEAU" "");choix du calque


(command "_pline") ; lancement de la commande polyligne

(setq ent(entlast))

(ade_odaddrecord ent "RESEAU");affectation de la table RESEAU à l'entité
	(ade_odsetfield ent "reseau" "diametre" 0 diametre_int)
	(ade_odsetfield ent "reseau" "visibilite" 0 visibilite_int)


);fin du defun 

 

Ce qu'il se passe c'est qu'il n'exécute pas tout ce qui se passe après la ligne (command "_pline") ? je ne sais pas pourquoi.

 

Merci de vos lumières

 

Cordialement,

 

Laurent

Posté(e)

 

 

Hello,

 

Après (command "pline") Acad s'attend à recevoir des points (soit des (getpoints), soit des (list x y).

Or, tu lui envoies une entité (entlast), il ne sais pas quoi en faire.

 

A quoi servent les (ade_odaddrecord ...) ?

 

Que cherches-tu à faire exactement ?

 

 

Carboléüm, qui dessine aussi à la main -> Carboleum's sketchblog

Posté(e)

Salut,

 

Si tu veux laisser la main à l'utilisateur pour dessiner la polyligne, tu peux utiliser la "célèbre" boucle qui répète (command pause) tant que la commande est active.

 

(command "_.pline")
(while (  (command pause)
)

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

Posté(e)

Bonjour,

 

Merci Gile de ta réponse qui a répondu parfaitement à ma demande.

 

Carboleum,

 

ade_odaddrecord sert a ajouter des données d'objet , ce sont des fonctionnalités spécifiques a MAP

 

Cependant je veux passer à une autre étape de mon programme: qui consiste à mettre une largeur de polyligne si la valeur VISIBILITE (objet data) est égal à "O"

 

J'ai donc réussi celui-ci , mais je le trouve lent..... De plus je voudrais savoir s'il y a la possibilité de mettre un réacteur, c'est a dire que lorsque la valeur VISIBILITE et modifier que la polyligne se mette à jour en temps réel. Mais là je ne sais pas du tout faire....

 

Merci de votre aide,

 

Voici le code:

 


(defun c:majobj()

(setq ix 0)

(if (setq sel (ssget "X" (list (cons 0 "LWPOLYLINE") (cons 8 "SME_RESEAU"))))

(progn
(repeat (sslength sel)
	(setq ent (ssname sel ix))
		(setq VISIBILITE (ade_odgetfield ent "RESEAU" "VISIBILITE" 0))
		(setq DIAMETRE (ade_odgetfield ent "RESEAU" "DIAMETRE" 0))
		
		(if (= VISIBILITE "O")
			(progn
				(command "pedit" ent "LA" (* diametre 0.001) "")
			)
				(command "pedit" ent "LA" 0 "")
		);fin du if
		
(setq ix (+ ix 1))

);fin du repeat

);fin du progn

);fin du if

);fin du defun



 

Cordialement,

 

Laurent

Posté(e)

Re,

 

Ton code est lent principalement parce que tu utilises (command ...).

La première façon de l'accélérer serait déjà de supprimer les invites sur la ligne de commande en mettant la variable système CMDECHO à 0 avant de commencer le traitement (et de lui rendre sa valeur initiale ensuite).

Mais ceci ne te ferais pas gagner grand chose et, de toutes façons, si tu veux utiliser les réacteurs, tu pourras plus utiliser (command ...) dans les fonction de "retro-appel" (callbacks).

 

Il est donc temps de passer à la vitesse supérieure.

Pour modifier les propriétés des entités en LISP (ou pour en créer), il y a deux méthodes alternatives à l'appel des commandes natives. Elles ont toutes deux des temps d'exécution équivalents qui sont beaucoup plus rapide que l'utilisation de command et c'est sensible quand on traite beaucoup d'objets comme tu sembles le faire.

 

La première (pur AutoLISP) consiste à agir sur les données DXF de l'entité. On récupère ces données sous forme de liste de paires pointées (ou de sous liste) avec la fonction entget. Dans chaque paire pointée (ou sous liste) de la liste retournée, le premier élément est le "code de groupe DXF", ces codes (nombre entiers) permettent de différentier les données et aussi d'accéder directement à la paire pointée dans la liste avec la fonction assoc.

Il suffi de modifier la liste DXF (de manière valide bien sûr) d'une entité pour modifier cette entité.

Dans ton exemple, on va agir sur le groupe DXF 43 qui définit la largeur constante des polylignes (tu trouveras dans l'aide aux développeurs une description des groupes DXF, en français (!)).

Ce groupe n'est présent dans la liste que si la polyligne a effectivement une largeur constante, il faudra donc tester s'il est présent pour le modifier avec subst si c'est le cas ou sinon, l'ajouter à la liste avec append.

 

(defun c:majobj	(/ ix sel ent elst visibilite diametre)
 (setq ix 0)
 (if (setq sel (ssget "X" (list (cons 0 "LWPOLYLINE") (cons 8 "SME_RESEAU"))))
   (progn
     (repeat (sslength sel)
(setq ent (ssname sel ix))
(setq elst (entget ent)) ;_ liste des données DXF de la polyligne
(setq VISIBILITE (ade_odgetfield ent "RESEAU" "VISIBILITE" 0))
(setq DIAMETRE (ade_odgetfield ent "RESEAU" "DIAMETRE" 0))
(if (= VISIBILITE "O")
  (if (assoc 43 elst)
    (entmod (subst (cons 43 (* diametre 0.001)) (assoc 43 elst) elst))
    (entmod (append elst (list (cons 43 (* diametre 0.001)))))
  ) ;_ fin du if
  (if (assoc 43 elst)
    (entmod (subst '(43 . 0.0) (assoc 43 elst) elst))
    (entmod (append elst '((43 . 0.0))))
  ) ;_ fin du if
) ;_ fin du if
(setq ix (+ ix 1))
     ) ;_ fin du repeat
   ) ;_ fin du progn
 ) ;_ fin du if
) ;_ fin du defun

 

L'autre méthode (Visual LISP) consiste à utiliser l'interface COM d'AutoCAD pour tout simplement modifier la propriété ConstantWidth de la polyligne.

Dans ce cas, il faut tout d'abord charger cette interface en ajoutant (vl-load-com) au début du code (aucune incidence si l'interface est déjà chargée).

Il faudra aussi convertir ent qui est lié à un ENAME en VLA-OBJECT pour pouvoir l'utiliser avec les fonctions vla-*.

Pour modifier les propriétés des objets, cette dernière méthode est plus facile à utiliser.

L'aide pour trouver les méthodes et propriétés applicables aux objets COM était dans l'aide aux développeurs à la rubrique ActiveX and VBA Reference (le VBA d'AutoCAD est basé sur cette même interface). Cette rubrique a disparu de l'aide avec la version 2011 (à récupérer sur une version antérieure).

 

(defun c:majobj	(/ ix sel ent visibilite diametre)
 (vl-load-com) ;_ charger l'interface COM/ActiveX
 (setq ix 0)
 (if (setq sel (ssget "X" (list (cons 0 "LWPOLYLINE") (cons 8 "SME_RESEAU"))))
   (progn
     (repeat (sslength sel)
(setq ent (ssname sel ix))
(setq obj (vlax-ename->vla-object ent)) ;_ convertir ename en vla-object
(setq VISIBILITE (ade_odgetfield ent "RESEAU" "VISIBILITE" 0))
(setq DIAMETRE (ade_odgetfield ent "RESEAU" "DIAMETRE" 0))
(if (= VISIBILITE "O")
  (vla-put-ConstantWidth obj (* diametre 0.001))
  (vla-put-ConstantWidth obj 0.0)
) ;_ fin du if
(setq ix (+ ix 1))
     ) ;_ fin du repeat
   ) ;_ fin du progn
 ) ;_ fin du if
) ;_ fin du defun

 

Je te laisse digérer ça avant de passer aux réacteurs car il s'agit là de passer encore au cran supérieur. De plus, je ne suis pas sûr de pouvoir t'aider ne connaissant pas MAP je ne sais pas bien comment on peut attraper/capturer une modification des ObjectData sur une entité.

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

Posté(e)

Bonsoir,

 

Un grand merci Gile pour tes explications. Il est vrai que cela est beaucoup plus compréhensible enV lisp voir même plus simple.

 

Pour les réacteurs, c'est pas grave je ferai sans car moi aussi j'en sais rien pour Map et même sur autocad je ne sais pas faire.

Je verrai cela pour une prochaine étape. Dans tout les cas , c'est déjà pas si mal.

 

Encore merci

 

Cordialement ,

 

Laurent

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é