Aller au contenu

lisp qui insère plusieurs blocs


Messages recommandés

Posté(e)

Bonjour à tous, pouvez-vous m’aider :

Je souhaite créer un lisp qui me permet d’insérer plusieurs blocs dwg.

 

L’idée serait la suivante :

sur base d’une liste Excel ou txt le programme lisp viendrai lire ce fichier xls ou txt

 

Exemple :

 

Nom du fichier Excel ( Selection.xls ) ou ( Selection.txt )

 

C:\bibliotheque\dwg\P&ID\01.dwg

C:\bibliotheque\dwg\P&ID\05.dwg

C:\bibliotheque\dwg\P&ID\10.dwg

C:\bibliotheque\dwg\P&ID\11.dwg

C:\bibliotheque\dwg\P&ID\18.dwg

C:\bibliotheque\dwg\P&ID\22.dwg

C:\bibliotheque\dwg\P&ID\23.dwg

 

Si qu’elle qu’un à une idée c’est sympa

D’avance merci.

 

Posté(e)

Salut et bienvenue,

 

Il est beaucoup plus facile de traiter des fichiers ascii (txt, csv...) que des fichiers xls.

Au vu de ta demande, je te recommanderais de commencer avec des fichiers texte. Pour ça, AutoLISP fournit toutes les fonctions nécessaires, pas besoin de fonctions Visual LISP.

 

Si tu veux pouvoir choisir le fichier à traiter, la fonction getfiled ouvre la boite de dialogue standard dr sélection de fichier et retourne le chemin complet du fichier.

 

Il faut ensuite ouvrir le fichier en lecture avec la fonction open (argument "r" pour read).

 

La fonction read-line permet de lire successivement les lignes du fichier. Utilisée dans une boucle while, tu peux, tant qu'il y a des lignes vérifier si le fichier existe avec findfile et, s'il existe, l'insérer (il faut au moins spécifier le point d'insertion).

 

Une fois la procédure terminée, il est impératif de fermer le fichier avec la fonction close.

 

Si tu tiens à utiliser un fichier Excel, tu peux utiliser ou t'inspirer des routines de GetExcel, mais c'est du LISP d'un autre niveau.

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

Posté(e)

Merci pour les conseils,

Mais je suis novice en la matière, tout au plus je pourrais m'inspirer d'une routine déjà existante et peut-être arriver à l'adapter.

je vais voire.

 

Posté(e)

Salut,

 

Je veux bien t'aider un peu plus avant mais une chose reste obscure pour moi :

on insère tous les blocs nommés dans le fichier, OK. Mais où ?

tous en 0,0 ?

faut-il laisser la main à l'utilisateur à chaque bloc pour qu'il spécifie le point d'insertion ?

s'agit-il juste d'ajouter les blocs à la collection sans les insérer ?...

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

Posté(e)

Bonjour,

 

je me posais les mêmes questions.

 

J'ai fait quelque chose qui laisse la main à l'utilisateur pour les insérer où il veux. J'ai fixé l'échelle à 1 et l'angle de rotation à 0.

 

(defun insmul_err (msg)
 (command "_.undo" "_end")
 (setvar "ATTREQ" oldattreq)
 (alert (strcat "Erreur : " msg))
 (setq *error* m:err ;; restaurer *error*
       m:err nil
 )
 (princ)
)

(defun c:insmul (/ nomf oldattreq f l blocname)
 (vl-load-com)
 (setq m:err *error*      ;;sauvegarder *error*
       *error* insmul_err ;;redéfinir *error*
 )
 ;; trouver le fichier qui contient les noms de blocs
 (setq nomf (getfiled "Sélectionner un fichier" "" "txt" 0))
 (if nomf                                        ;; si un fichier a été sélectionné
   (progn
     (setvar "CMDECHO" 0)                        ;; n'affiche pas le détail des commandes
     (command "_.undo" "_begin")
     (setq oldattreq (getvar "ATTREQ"))          ;; mettre de côté la valeur courante de ATTREQ
     (setvar "ATTREQ" 0)                         ;; s'il y a des attributs, prendre les valeurs par défaut
     (setq f (open nomf "r"))                    ;; ouvrir le fichier nomf en lecture
     (while (setq l (read-line f))               ;; lire chaque ligne l de f
       (setq blocname (vl-filename-base l))      ;; extraire le nom du bloc
       (if (tblsearch "BLOCK" blocname)          ;; vérifier s'il est déjà inséré dans le fichier
         (setq l blocname)                       ;; dans ce cas on insère le bloc déjà présent
         (if (not (findfile l))                  ;; sinon on vérifie si le fichier existe
           (progn
             (alert (strcat l "\nnon trouvé"))   ;; faut croire qu'il n'existe pas
             (setq l nil)                        ;; et on met l à nil pour éviter d'insérer un bloc inexistant
           )
         )
       )
       (if l                                     ;; le bloc existe soit dans la table de bloc, soit dans le répertoire spécifié
         (command "_insert"                      ;; on lance la commande INSERER
           l                                     ;; du bloc l
           pause                                 ;; on attend que l'utilisateur donne le point d'insertion
           1                                     ;; echelle x fixée à 1
           1                                     ;; echelle y fixée à 1
           0                                     ;; angle de rotation fixée à 0
         ) 
       )
     ) ;; while
     (close f)                                   ;; fermer le fichier f
     (setvar "ATTREQ" oldattreq)                 ;; remettre ATTREQ à sa valeur initiale
     (command "_.undo" "_end")
   )
 )
 (princ)
) 

 

S'il s'agit d'ajouter les blocs à la collection sans les insérer, on sait faire sans lisp avec designcenter

 

Amicalement

Vincent

 

 

[Edité le 7/12/2009 par zebulon_]

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Posté(e)

Ceux qui me connaissent savent mon avis.

En la matière, mieux vaut débuter par une petit script.

 

En effet, mieux vaut régler ATTREQ et les ACCROBJ à 0. Mais le script est mon réflexe quand je vois des listing Excel ou Txt avec quelqu'un qui maitrise Excel.

L'adaptation necessaire sera probablement d'utiliser Excel pour remplacer les \ par des / ou des \\.

En script, la commande INSERER a besoin du point puis des instructions 1 1 0 (échelle X, Y et rotation).

 

Avant de lisper, scriptez :D

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Posté(e)

Salut gile en réponse à ton courrier du 7-12

 

Oui mais de la manière suivante :

Actuellement j’utilise les scripts.

Chaque symbole est inséré par un script,

Au départ je défini le point 0,0,0 puis j’insére les blocs les un à la suite des autres en 0,0,0, afin qu’ils ne se superposent les uns sur les autres

Je redéfini l’ucs origine 0,0,0 en tenant compte de la largeur du bloc inséré.

 

Pour info j’utilise les clichés de la boite de dialogue généré par slidelib , c’est ancien mais les scripts dans les palettes d’outils ça marche pas !

 

 

L’idée et de me faciliter la vie en générant des plans de façons automatique par une sélection de bloc au choix dans un ordre logique de fonctionnent technique.

se trouvant dans un fichier excel sous forme de devis puis les éléments sélectionnés avec leur chemin d’accès, leur position leur grandeur seront transférées dans un fichier txt ou csv qui sera lu par un lisp.

 

 

Exemple de script

 

filedia 0

_insert

c:/biblio/dwg/model/VA1-1

0,0

 

 

 

_ucs

origin

52.5000,0

_zoom

_extents

pulsion

$i=pulsion1 $i=*

filedia 1

 

 

Ce script fonctionne sauf la syntax $i=pulsion1 $i=*

qui fonctionné autocad r12 qui faisait un rappel immédiat de la boite de cliché pulsion après insertion.

 

 

Merci d’avance.

[Edité le 9/12/2009 par lex]

 

[Edité le 9/12/2009 par lex]

  • 4 mois après...
Posté(e)

Bonsoir zebulon, encore merci pour ton lisp insmul c’est super, je ne suis pas un crack en lisp mais j’ai essayé d’adapter mon script dans ton code mais sans succès.

Comme ce-ci tu voies l’amateur.

 

(defun insmul_err (msg)
 (command "_.undo" "_end")
 (setvar "ATTREQ" oldattreq)
 (alert (strcat "Erreur : " msg))
 (setq	*error*	m:err			; restaurer *error*
m:err nil
 )
 (princ)
)

(defun c:insmul	(/ nomf oldattreq f l scriptname)
 (vl-load-com)
 (setq	m:err	*error*			; sauvegarder *error*
*error*	insmul_err		; redéfinir *error*
 )
 ;; trouver le fichier qui contient les noms de blocs
 (setq nomf (getfiled "Sélectionner un fichier" "" "txt" 0))
 (if nomf				; si un fichier a été sélectionné
   (progn
     (setvar "CMDECHO" 1)		; n'affiche pas le détail des commandes
     (command "_.undo" "_begin")
     (setq oldattreq (getvar "ATTREQ")); mettre de côté la valeur courante de ATTREQ
     (setvar "ATTREQ" 0)		; s'il y a des attributs, prendre les valeurs par défaut
     (setq f (open nomf "r"))		; ouvrir le fichier nomf en lecture
     (while (setq l (read-line f))	; lire chaque ligne l de f
(setq script (vl-filename-base l)) ; extraire le nom du bloc
(if (tblsearch "script" scriptname)
				; vérifier s'il est déjà inséré dans le fichier
  (setq l scriptname)		; dans ce cas on insère le bloc déjà présent
  (if (not (findfile l))	; sinon on vérifie si le fichier existe
    (progn
      (alert (strcat l "\nnon trouvé"))
				; faut croire qu'il n'existe pas
      (setq l nil)		; et on met l à nil pour éviter d'insérer un bloc inexistant
    )
  )
)
(if l				; le bloc existe soit dans la table de bloc, soit dans le répertoire spécifié
  (command "_script"		; on lance la commande INSERER
	   l			; du bloc l
	   pause		; on attend que l'utilisateur donne le point d'insertion
  )
)
     )					; while
     (close f)				; fermer le fichier f
     (setvar "ATTREQ" oldattreq)	; remettre ATTREQ à sa valeur initiale
     (command "_.undo" "_end")
   )
 )
 (princ)
)

 

Posté(e)

Bonjour,

 

tu essayes de lancer un script depuis un lisp. Soit tu suis la proposition de Tramber, tu écris un un script et tu l'exécutes, soit tu veux pousser plus loin et utiliser le lisp. Pas les 2 en même temps.

 

Amicalement

Vincent

 

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

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é