Aller au contenu

Cherche 2 Routines sur les PLines 2D closes et TEXT


lecrabe

Messages recommandés

Bonjour

 

Malgre mes recherches sur le Web, le vieux Decapode n'a pas trouve son bonheur !

 

*** 1 *** Text inside 2DPlines *** ---> Selection courante

 

1) Poser une question : Texte Unique (UN SEUL) , Zero Texte (AUCUN) , Textes multiples (N Textes)

A propos on ne s'occupe que de textes simples (TEXT) - On ne traite pas les Multi-textes !

 

2) Selection AutoCAD classique

On ne retient que les Polylignes (legeres ou lourdes) 2D closes/fermees

 

3) En sortie, on dispose dans la selection courante, des polylignes (suivant la reponse a la 1ere question) avec :

- UN SEUL texte inside (A l'interieur)

- ZERO texte inside (A l'interieur)

- N textes inside (A l'interieur)

 

On se base sur le point d'insertion du texte simple : aucune importance si le texte deborde a l'exterieur

 

 

** 2 *** ONE Text inside 2DPlines et fichier CSV *** ---> Selection courante

 

Soit un fichier CSV tres simple, contenant N lignes avec UN SEUL texte par ligne

Par exemple un Numero : 123 , A0123 , AB789 , etc

 

Soit une selection AutoCAD classique de N Polylignes (legeres ou lourdes) 2D closes/fermees

On suppose que TOUTES ces PLines ont UN SEUL texte a l'interieur !?

 

Le resultat sera une selection de toutes les Polylignes pour lesquelles le texte (On suppose qu'il est UNIQUE et present) a l'interieur est present exactement dans le fichier CSV ...

 

On a fait les tests necessaires grace a la routine precedente ...

 

Donc je pense qu'il faut lire d'abord TOUT le fichier CSV, le monter dans une liste

et apres pour chaque Pline et SON texte a l'interieur, faire le texte d'egalite et

en consequence garder ou pas l'identifiant de la Pline pour creer A LA fin un jeu de selection ...

 

Merci d'avance de votre aide, Bye, lecrabe

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Salut au Décapode.

 

Je ne sais pas si ça peut t'aider, mais j'ai un Lisp de (gile) modifié par BonusCAD qui crée un jeu de sélection avec tous les objets contenus ou capturés, dans la vue courante, par l'objet sélectionné (cercle, ellipse, polyligne fermée).

 

Ça ne fait pas ce que tu veux, mais je pense que ça peut servir de base...

 

En espérant que ça te serve.

 

Denis...

SupCommuneVide_BonusCad.zip

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Salut à tous

 

Mon crabe aux pinces d'or, j'ai beau lire ton CDC et je ne comprends pas. L'age ou la fin de semaine ?

Si tu pouvais nous illustrer ta demande par un dessin / schéma / grafcet.

 

Sur ce, je vais finir mon muscadet.

 

@+

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

Hello Patrick

 

C'est bien la 1ere fois que l'on me dit que mon CDC/CCTP est incomprehensible !!

 

Je vais essayer de re-expliquer la 2eme routine demandee

La plus "importante" pour moi

La 1ere routine serait utilisee pour verifier le DWG AVANT d'utiliser la 2eme ...

 

** 2 *** ONE Text inside 2DPlines et fichier CSV *** ---> Selection courante

 

Soit un fichier CSV tres simple, contenant N lignes avec UN SEUL texte par ligne

Par exemple un Numero : 123 , A0123 , AB789 , etc

 

Soit une selection AutoCAD classique de N Polylignes (legeres ou lourdes) 2D closes/fermees

On suppose que TOUTES ces PLines ont UN SEUL texte a l'interieur !?

 

Le resultat sera une selection de toutes les Polylignes pour lesquelles le texte (On suppose qu'il est UNIQUE et present) a l'interieur est present exactement dans le fichier CSV ...

 

On a fait les tests necessaires grace a la routine precedente ...

 

Donc je pense qu'il faut lire d'abord TOUT le fichier CSV, le monter dans une liste

et apres pour chaque Pline et SON texte a l'interieur, faire le texte d'egalite et

en consequence garder ou pas l'identifiant de la Pline pour creer A LA fin un jeu de selection ...

 

1) Soit un DWG avec des Polylignes 2D (Legeres ou Lourdes) Closes/Fermees

2) En principe toutes les Polylignes ont UN SEUL texte simple dessine a l'interieur

Ce texte simple est un IDENTIFIANT pour la Polyligne (No/Code de Piece dans un batiment, No/Code Parcelle dans un Cadastre, etc)

- Si ZERO Texte alors la PLine ne sera jamais retenue !

- Si 2/3/4 Textes alors la PLine ne sera jamais retenue !

 

C'est pourquoi j'ai besoin de la 1ere routine pour VERIFIER le DWG AVANT !

Mais ce n'est pas la priorite No 1 !!

 

... Attention il peut y avoir plusieurs fois le meme Identifiant ...

... MAIS dans des PLines differentes ...

 

3) J'ai "a cote" un fichier texte CSV de N lignes ultra-simple ...

Chaque ligne contient un texte (ensemble de lettres , chiffres , - , _ )

qui correspond "peut etre" a UN ou N textes dans les Polylignes !?

 

Donc la 2eme routine doit :

- Demander le fichier CSV

- Lire le fichier CSV et stocker dans une liste TOUTES les lignes d'Identifiants

- Demander une selection AutoCAD classique DONT on ne retient QUE :

Les Polylignes 2D (legeres/lourdes) closes/fermees ET les Textes simples

- Parcourir TOUTES les PLines concernees, detecter un texte a l'interieur (Utilisation sans doute du Special_Selection de Gilles et de son option SSOF sur la PLine)

- Comparer le texte trouve a l'interieur par rapport a la liste CSV

- Si EGALITE (avec un quelconque element de la liste) alors on "garde" la PLine

Des qu'on trouve une egalite, on arrete de parcourir la liste !

- Si NON-EGALITE alors on "jette" la PLine

 

Et on boucle sur la selection ... PLine suivante ...

 

A la sortie, je desire simplement un jeu de selection des N Polylignes dont le texte a l'interieur correspond a n'importe quel texte de la liste CSV !

 

Eventuellement qq petits compteurs seraient sympas ! ... du genre ...

- xxxx lignes dans le fichier CSV

- yyyy PLines analysees

- zzzz PLines "retenues" et donc dans le jeu de selection courant

 

A votre bon coeur, Merci d'avance, Le crabe

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Hello,

 

Tu peux essayer ça qui doit fonctionner.

 


(defun C:POLYTXT ( / sChoix JEU JEU_POLY JEU_POLY_OK I J oEnt oPoly lsPts iNbText ptLst )
 (initget 1 "Aucun Un Plusieurs")
 (setq sChoix (getkword "\nAucun/Un/Plusieurs "))
 (if (setq JEU (ssget (list (cons 0 "*POLYLINE,TEXT"))))
   (progn
     (setq I 0  JEU_POLY (ssadd))
     (repeat (sslength JEU)
(setq oEnt (ssname JEU I))
(setq I (1+ I))
(if (= "TEXT" (cdr (assoc 0 (entget oEnt))))
 	(setq lsPts (append lsPts (list (GetTextPosition oEnt))))
 	(if (= 1 (logand 1 (cdr (assoc 70 (entget oEnt)))))
   	(ssadd oEnt JEU_POLY)
 	)
)
     )
     (setq JEU nil I 0  JEU_POLY_OK (ssadd))
     (repeat (sslength JEU_POLY)
(setq oPoly (ssname JEU_POLY I))
(setq I (1+ I))
(setq J 0  iNbText 0 ptLst (GetCoordinates oPoly))
(repeat (length lsPts)
 	(if (In_Figure (nth J lsPts) ptLst)
   	(setq iNbText (1+ iNbText))
 	)
 	(setq J (1+ J))
)
       (cond ((and (= 0 iNbText) (= sChoix "Aucun")) 	(ssadd oPoly JEU_POLY_OK))
     	((and (= 1 iNbText) (= sChoix "Un"))        (ssadd oPoly JEU_POLY_OK))
     	((and (> iNbText 1) (= sChoix "Plusieurs")) (ssadd oPoly JEU_POLY_OK))
)
     )
     (sssetfirst nil JEU_POLY_OK)
   )
 )
)
(defun C:POLYCSV ( / sFileName JEU JEU_POLY JEU_POLY_OK I J oEnt lsText lsPts)
 (if (and (setq sFileName (getfiled "sélectionner un fichier CSV" (getvar "DWGPREFIX") "CSV" 0))
  	(setq JEU (ssget (list (cons 0 "*POLYLINE,TEXT"))))
     )
   (progn
     
     (setq f (open sFileName "r"))
     (while (setq sLine (read-line f))
(setq lsText (append lsText (list sLine)))
     )
     (close f)
     
     (setq I 0  JEU_POLY (ssadd))
     (repeat (sslength JEU)
(setq oEnt (ssname JEU I))
(setq I (1+ I))
(if (= "TEXT" (cdr (assoc 0 (entget oEnt))))
 	(if (member (cdr (assoc 1 (entget oEnt))) lsText)
   	(setq lsPts (append lsPts (list (GetTextPosition oEnt))))
 	)
 	(if (= 1 (logand 1 (cdr (assoc 70 (entget oEnt)))))
   	(ssadd oEnt JEU_POLY)
 	)
)
     )
     (setq JEU nil I 0  JEU_POLY_OK (ssadd))
     (repeat (sslength JEU_POLY)
(setq oPoly (ssname JEU_POLY I))
(setq I (1+ I))
(setq J 0  iNbText 0 ptLst (GetCoordinates oPoly))
(repeat (length lsPts)
 	(if (In_Figure (nth J lsPts) ptLst)
   	(setq iNbText (1+ iNbText))
 	)
 	(setq J (1+ J))
)
       (if (= 1 iNbText)
 	(ssadd oPoly JEU_POLY_OK)
)
     )
     (sssetfirst nil JEU_POLY_OK)
   )
 )
)

(defun GetTextPosition (oText / PT)
 (if (and oText
  	(= "TEXT" (cdr (assoc 0 (entget oText))))
     )
   (progn
     (if (and (= 0 (cdr (assoc 72 (entget oText)))) (= 0 (cdr (assoc 73 (entget oText)))))
(setq PT (cdr (assoc 10 (entget oText))))
(setq PT (cdr (assoc 11 (entget oText))))
     )
   )
 )
 PT
)

; == EN
;* The algorithm is taken on http://algolist.manual.ru/maths/geom/belong/poly2d.php
;* On the basis of vk_IsPointInside
;* Posted http://www.arcada.com.ua/forum/viewtopic.php?p=12322
;* Boundary - the list normalized [i.e. only or (X Y) or (X Y Z)] points
;* Point - chek point
;* Boundary - list of boundary point
(defun In_Figure (Point Boundary / FarPoint Check)
 ;_????????? Boundary ?? ??????? car ? last ???? ? ?? ?? ?????
 ;_The same point checks Boundary on a condition car and last
 (if (not (equal (car Boundary)(last Boundary) 1e-6))
   (setq Boundary (append Boundary (list(car Boundary)))))
 (setq FarPoint (cons (+ (apply 'max (mapcar 'car Boundary)) 1.0)
              		(cdr Point)
        		) ;_ end of cons
 ) ;_ end of setq
 (or
   (not
     (zerop
       (rem
         (length
           (vl-remove
             nil
             (mapcar
               (function (lambda (p1 p2) (inters Point FarPoint p1 p2))
               ) ;_ end of function
               Boundary
               (cdr Boundary)
             ) ;_ end of mapcar
           ) ;_ end of vl-remove
         ) ;_ end of length
         2
       ) ;_ end of rem
     ) ;_ end of zerop
   ) ;_ end of not
   (vl-some (function (lambda (x) x))
    		(mapcar
      		(function (lambda (p1 p2)
                  		(or Check
                      		(if (equal (+ (distance Point p1)
                                    		(distance Point p2)
                                    		) ;_ end of +
                                         (distance p1 p2)
                                         1e-3) ;_ end of equal
                        		(setq Check T) nil)
                      		)
                		) ;_ end of lambda
      		) ;_ end of function
      		Boundary
      		(cdr Boundary)
    		) ;_ end of mapcar
   ) ;_ end of vl-some
 ) ;_ end of or
)


(defun GetCoordinates (oPoly / ptLst)
 (if (and oPoly (setq oPolyLst (entget oPoly)))
   (progn
     ; poly allégée
     (if (= "LWPOLYLINE" (cdr (assoc 0 oPolyLst)))
(setq ptLst
         (mapcar 'cdr
  		(vl-remove-if-not '(lambda(x)(= 10 (car x))) (entget oPoly))
 	)
       )
;poly ancienne
(progn
 	(setq oVtx oPoly)
 	(while (/= "SEQEND" (cdr (assoc 0 (entget (setq oVtx (entnext oVtx))))))
   	(setq ptLst (append ptLst (list (cdr (assoc 10 (entget oVtx))))))
 	)
)
     )
   )
 )
 ptLst
)	

 

 

Olivier

Lien vers le commentaire
Partager sur d’autres sites

Hello Olivier

 

1) SUPER & MERCI ! ... La routine POLYCSV semble BIEN fonctionner ...

 

2) En fait on peut resoudre ce probleme avec des fonctionnalites de AutoCAD MAP

avancees et specifiques donc un peu compliquees (Sources de donnees, Gabarits de liens, etc) !

 

Sans parler du fait qu'il faut utiliser l'ODBC de Windows

et que ces Drivers Windows ODBC sont un peu "recalcitrants"

en fonction du Niveau d'Excel et/ou de Access DEJA installe(s) sur votre PC !!

et de la version de Windows utilisee : 32 ou 64 bits, Win XP, Win Seven, Win 8.0/8.1, Win 10 ...

 

3) En plus la routine POLYCSV fonctionne sur AutoCAD, ACAD MAP, ACAD Archi, etc ...

 

4) J'ai l'impression que tu avais "deja sous la main" la routine ou presque equivalent !?

 

5) RAPPEL: Si qq'un est capable de developper ma 1ere routine demandee pour verifier les DWGs avant de faire tourner POLYCSV, SVP je suis toujours preneur ...

 

MERCI, Bye, lecrabe

Autodesk Expert Elite Team

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é