Aller au contenu

Lisp Select-filter


Luna

Messages recommandés

Bonjour à toutes et à tous,

 

Après beaucoup de travail acharné, je me suis dit que je pourrais partager une routine que j'utilise au quotidien sur autoCAD et aussi dans mes programmes : (select-filter). Le but est assez simple, elle retourne un jeu de sélection (au même titre que la fonction (ssget) en appliquant des filtres) ainsi que le détail du nombre d'objets sélectionnés en fonction des différentes méthodes programmées.

 

C'est encore un peu brouillon et c'est loin d'être aussi parfait et optimisé que des routines de (gile) ou Patrick_35 (et je serais ravie d'avoir des propositions d'amélioration), mais je n'ai pas encore eu de problèmes alors.. ^^"

Je post le fichier .lsp correspondant (ça risque d'être un peu trop long si je le poste en dur ^^')

2020-03-17_Select-filter.LSP

 

Bref voilà, si jamais ça aide certaines personnes j'en serai ravie, et si j'ai des retours et/ propositions d'amélioration, je suis preneuse également ! ;)

Et puis il y a également quelques fonctions nécessaires à son fonctionnement qui peuvent également s'avérer utiles (Je remercie d'ailleurs Lee-Mac pour ses fonctions sur les blocs dynamiques et sur les options de la fonction (ssget) !!)

 

Bisous !

Lien vers le commentaire
Partager sur d’autres sites

  • 1 an après...

Bonjour

@Luna

Chat c'est vraiment gentil de partager, je pense que bien des utilisateurs en cours de formation vont être intéressés par ce LSP qui a l'air complet, je vais le regarder de plus près et reviendrai vers toi en chat de questions ou de suggestion, encore merci.

----------------------------------------------------------------------------------------------------

@PHILPHIL

Je ne connais pas ton niveau d'expérience en LSP mais, comme je l'explique sur mon site : puisqu'il n'y a pas de "c:" en entête du nom de commande derrière le DEFUN cela signifie que c'est une fonction qui ne sera pas appelée telle quelle en ligne de commande, mais à l'intérieur d'un programme en lui donnant les arguments attendus.
Les arguments attendus étant les "variables" situées entre la première parenthèse ouvrante et la barre oblique (slash).

Si tu souhaites la lancer en ligne de commande, comme à l'intérieur d'un programme, il faut la mettre entre parenthèses comme dans les exemples que Luna a pris la peine de retranscrire dans son programme.

Amicalement

Lien vers le commentaire
Partager sur d’autres sites

Coucou,

Nah c'est une fonction (je n'ai pas eu le courage de la transposer sous forme de commande) donc elle possède 4 arguments (cf. les commentaires sur le .lsp) :

  1. mode -> correspond à une chaîne de caractères. 4 valeurs possibles :
    - "DXF" permet d'effectuer une sélection basée sur la liste DXF d'un objet donc fonctionne de la même façon que la fonction (ssget) avec la liste des filtres
    - "BLC" permet d'effectuer une sélection basée sur le nom de la définition de bloc (donc références de blocs uniquement)
    - "ATT" permet d'effectuer une sélection basée sur le nom et/ou la valeur d'un ou plusieurs attribut de bloc (donc références de blocs uniquement)
    - "DYN" permet d'effectuer une sélection basée sur le nom et/ou la valeur d'une ou plusieurs propriété dynamique de bloc (donc références de blocs uniquement)
  2. blocname  -> correspond soit au nom de la définition de bloc (pour les modes "BLC", "ATT" et "DYN") en recherche relative (cf. Wildcard Characters) sous format string, soit à la liste des codes DXF que l'on souhaite trier (pour le mode "DXF") sous format liste.
  3. tag  -> correspond soit au nom de l'attribut/propriété dynamique (pour les modes "ATT" et "DYN") en recherche relative sous format string, soit au mode de sélection de la fonction (ssget) (cf. Méthode de sélection (ssget)) sous format string (pour les modes "DXF" et "BLC")
  4. value  -> correspond soit à la valeur de l'attribut/propriété dynamique (pour les modes "ATT" et "DYN") en recherche relative sous format string, soit à la liste de filtres de la fonction (ssget) (cf. Filtres de sélection) sous format liste (pour les modes "DXF" et "BLC")

Quelques exemple d'utilisation :

;; Aucune pré-sélection, donc sélection de la totalité des blocs dont le nom commence par "SUNGROW" et possède la chaîne "Eclisse"
Commande: (select-filter "BLC" "SUNGROW*Eclisse*" nil nil)
Nombre d'objet(s) sélectionné(s) = 6410 u
Liste des blocs trouvés :
  - SUNGROW - Eclisse (6410u - 100%)
<Selection set: 2163>

;; Pré-sélection d'objets avant lancement de la fonction donc seul les blocs pré-sélectionnés sont décomptés
Commande: (select-filter "BLC" "*" nil nil)
Nombre d'objet(s) sélectionné(s) = 1208 u
Liste des blocs trouvés :
  - Module générique F 2000x992x40 (448u - 37.09%)
  - SUNGROW - Eclisse (200u - 16.56%)
  - SUNGROW - Fixation structure primaire (8u - 0.66%)
  - SUNGROW - Flotteur (Ext.) (120u - 9.93%)
  - SUNGROW - Flotteur (Int.) (224u - 18.54%)
  - SUNGROW - Structure primaire (6.37m) (128u - 10.6%)
  - SUNGROW - Structure secondaire (4.25m) (16u - 1.32%)
  - SUNGROW - Structure secondaire (6.38m) (64u - 5.3%)
<Selection set: 217d>

;; Aucune pré-sélection donc sélection de la totalité des blocs possédant un attribut nommé "A"
Commande: (select-filter "ATT" "*" "A" "*")
Nombre d'objet(s) sélectionné(s) = 97 u selon la recherche des propriétés :
  - "A" = "01" ( 1u - 1.03%)
  - "A" = "02" ( 1u - 1.03%)
  - "A" = "03" ( 1u - 1.03%)
  - "A" = "04" ( 1u - 1.03%)
  - "A" = "05" ( 1u - 1.03%)
  - "A" = "06" ( 1u - 1.03%)
  - "A" = "07" ( 1u - 1.03%)
  - "A" = "08" ( 1u - 1.03%)
  - "A" = "09" ( 1u - 1.03%)
  - "A" = "1" ( 8u - 8.25%)
  - "A" = "10" ( 7u - 7.22%)
  - "A" = "11" ( 1u - 1.03%)
  - "A" = "12" ( 1u - 1.03%)
  - "A" = "13" ( 1u - 1.03%)
  - "A" = "14" ( 1u - 1.03%)
  - "A" = "15" ( 1u - 1.03%)
  - "A" = "16" ( 1u - 1.03%)
  - "A" = "17" ( 1u - 1.03%)
  - "A" = "18" ( 1u - 1.03%)
  - "A" = "19" ( 1u - 1.03%)
  - "A" = "2" ( 6u - 6.19%)
  - "A" = "20" ( 1u - 1.03%)
  - "A" = "21" ( 1u - 1.03%)
  - "A" = "22" ( 1u - 1.03%)
  - "A" = "23" ( 1u - 1.03%)
  - "A" = "24" ( 1u - 1.03%)
  - "A" = "25" ( 1u - 1.03%)
  - "A" = "26" ( 1u - 1.03%)
  - "A" = "27" ( 1u - 1.03%)
  - "A" = "28" ( 1u - 1.03%)
  - "A" = "29" ( 1u - 1.03%)
  - "A" = "3" ( 6u - 6.19%)
  - "A" = "30" ( 1u - 1.03%)
  - "A" = "31" ( 1u - 1.03%)
  - "A" = "32" ( 1u - 1.03%)
  - "A" = "33" ( 1u - 1.03%)
  - "A" = "4" ( 6u - 6.19%)
  - "A" = "5" ( 6u - 6.19%)
  - "A" = "6" ( 6u - 6.19%)
  - "A" = "7" ( 6u - 6.19%)
  - "A" = "8" ( 6u - 6.19%)
  - "A" = "9" ( 6u - 6.19%)
  - "A" = "C" ( 2u - 2.06%)
Liste des blocs trouvés :
  - Repère (97u - 100%)
<Selection set: 219d>

;; Utilisation du précédent jeu de sélection pour décompte des blocs selon leur calque
Commande: (select-filter "DXF" '(8) nil nil)
Nombre d'objet(s) sélectionné(s) = 97 u
Liste des entités trouvées pour le code DXF "8" :
  - "0" (64u - 65.98%)
  - "UBS-400-Zonage (Assemblage)" (33u - 34.02%)
<Selection set: 21a8>

;; Sélection manuelle de blocs dont le nom commence par "Module" et qui sont situés sur le calque "0" ou les calques commençant par "UBS-100-"
Commande: (select-filter "BLC" "Module*" "user" '((8 . "0,UBS-100-*")))
Seul(s) le(s) bloc(s) "Module FS 6g 2.004x1.232m", "Module générique A 1650x992x35", "Module générique B 1685x1000x42", "Module générique C 1698x1004x35", "Module générique D 1735x1010x42", "Module générique E 1757x1048x35", "Module générique F 2000x992x40", "Module générique G 2024x1004x35", "Module générique H 2108x1048x35", "Module générique J 2187x1102x30" seront pris en compte dans la sélection.
Sélectionner des objets: 0 trouvé(s)
Sélectionner des objets: Spécifiez le coin opposé: 5443 trouvé(s), 13 groupes, 5443 au total
Sélectionner des objets:
Nombre d'objet(s) sélectionné(s) = 5264 u
Liste des blocs trouvés :
  - Module générique F 2000x992x40 (5264u - 100%)
<Selection set: 21bf>

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

merci @didier !
je sais déjà que l'écriture de la fonction pourrait être grandement simplifiée mais je n'ai pas beaucoup de temps pour la modifier actuellement. Toute remarque sera la bienvenue et ce n'est que récemment que j'ai amélioré les commentaires en début de fichier donc il faudra que j'essaye d'ajouter quelques ligne de commentaires pour mieux expliciter les potentialités de la fonction et son fonctionnement.

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

Coucou,

Bon petite refonte de ma fonction (Select-Filter) pour plus d'efficacité et de possibilité dans la gestion des filtres. De nombreux changements sur l'utilisation de la fonction mais l'ensemble des pratiques d'utilisation de la fonction sont clairement explicitées sur le fichier .lsp ci-joint, en début de programme. J'ai également ajouté un ensemble de commentaires pour faciliter sa compréhension dans la limite du raisonnable et pour permettre de la modifier en cas de nécessité :3
Ci-dessous les commentaires d'explication pour l'utilisation de la fonction avec l'explication de chaque argument et quelques exemples d'utilisation :

--- Nom de la fonction		[]-----------------------[] Select-Filter []-----------------------[]
--- Date de création		> 18/02/2020
--- Dernière modification	> 20/04/2021
--- Auteur(e)			> Luna
--- Version			> 3.0.0
--- Classe			> "DtSel"

--- But et domaine d'application													
	> Afin de faciliter grandement la sélection de blocs dynamiques, cette fonction a pour but de pouvoir sélectionner les blocs
	(ou objet) selon différents modes et ainsi retourner la composition du jeu de sélection en fonction des paramètres spécifiés.
	Il est ainsi possible de filtrer les blocs par rapport à leurs attributs, propriétés dynamiques, EffectiveName, liste DXF, etc
	Son fonctionnement est similaire à la fonction (ssget), avec quelques ajouts en plus. Le retour dans l'historique de commande
	permet d'avoir un décomptes des blocs et objet en fonction de leurs propriétés respectives.
	Attention cependant, après plusieurs essais, il semblerait que la fonction n'est pas en mesure de fonctionner correctement lors
	d'une sélection importante (limite du nombre d'objets à définir), générant une erreur de "Access violation ...".

--- Déclaration des arguments
	La fonction (Select-Filter) possède 4 argument(s) :
		¤ mode		> 4 modes de sélection ont été programmé :
			"DXF"	permet d'effectuer une sélection standard (ssget) en ajoutant tout de même un décompte des objets selon
				leurs propriétés DXF (spécifiées en argument).

			"BLC"	permet d'effectuer une sélection à partir de l'EffectiveName de la référence de bloc, permettant ainsi
				de sélectionner sans encombre des blocs dynamiques et standard. Le décompte se fera donc en fonction du
				nom de chaque définition de bloc présente dans le jeu de sélection. Si aucune pré-sélection, utilise le
				mode de sélection "_X" de la fonction (ssget).

			"ATT"	permet d'effectuer une sélection à partir du nom et/ou de la valeur d'un ou plusieurs attribut(s) de
				références de bloc (standard et/ou dynamique). Le décompte se fera donc en fonction du nom de l'attribut
				et de sa valeur. Si aucune pré-sélection, utilise le mode de sélection "_X" de la fonction (ssget).
																	
			"DYN"	permet d'effectuer une sélection à partir du nom et/ou valeur d'une ou plusieurs propriété(s) dynamique
				de références de bloc (dynamique uniquement). Le décompte se fera donc en fonction du nom de la
				propriété dynamique et de sa valeur. Si aucune pré-sélection, utilise le mode de sélection "_X" (ssget).

			(type mode) = 'STR	| Ex. :	"DXF", "BLC", "ATT" ou "DYN"

		¤ filter	> en fonction du mode de sélection, 2 possibilités :
			si mode = "DXF"	alors filter correspond à la liste des codes DXF que l'on souhaite utiliser pour le décompte.
					Si un objet ne possède aucun des codes DXF spécifiés, il n'apparaîtra pas dans le décompte
					détaillé, mais il sera tout de même présent dans le jeu de sélection et le nombre d'objets.
			(type filter) = 'LST	| Ex. :	'(0 8), '(0), '(6 62 420), ...

			si mode = "BLC"	alors filter correspond à la clé de recherhe concernant l'EffectiveName du bloc. Une clé de
			ou mode = "ATT"	recherche permet l'utilisation de Wildcard Characters afin de spécifier plusieurs nom de blocs
			ou mode = "DYN"	par exemple ou bien une recherche relative, etc.
			(type filter) = 'LST	| Ex. :	'("Module*" "PDT*,PDL*,Local*,LT*"), '("*"), '("*PVBlock"), ...

		¤ arg-lst	> correspond à la liste des arguments de la fonction (ssget) pour une utilisation de la fonction native
				dans ses pleines possibilités. Prise en compte des arguments facultatifs de (ssget) sous forme de liste
				ainsi faite ([sel-method] [pt1 [pt2]] [pt-list] [filter-list]). Voici une liste non-exhaustive des
				méthodes de sélection de la fonction (ssget), proposée par LeeMac :
						- "_"	Non-localised mode string prefix
								Ensures the English version of the mode string is used in non-English
								versions of AutoCAD. Not strictly necessary for all mode strings, but
								safer to include than exclude.
						- "+."	Point selection mode
								Forces ssget to remain in 'point' mode, similar to setting PICKAUTO to 0
								May be combined with the ":S" single-selection mode and ":E" mode to
								emulate an entsel selection by avoiding implied selection windows.
						- "A"	All
								Similar to the "X" mode string but excludes objects on frozen layers.
								Selects all objects on thawed layers. This mode string cannot be
								combined with graphical selection mode strings.
						- "B"	Box
								Selects all objects inside or crossing a rectangle specified by 2 points
								If the points are specified from right to left, Box is equivalent to
								Crossing. Otherwise, Box is equivalent to Window.
						- "C"	Crossing
								Selects objects residing within and/or crossing a rectangular area
								defined by two points. The supplied points should be expressed relative
								to the UCS, however, the crossing window will always be orthogonal to
								the WCS axes.
								Caution: Only objects visible in the drawing area at the time of
								selection will be selected by this method. Consider temporarily zooming
								to the selection window before performing the selection, and then zoom
								previous to restore the original screen position.
						- "CP"	Crossing Polygon
								Selects objects residing within and/or crossing a polygon defined by a
								list of UCS points. The polygon can be any shape but cannot cross or
								touch itself. AutoCAD will construct the last segment of the polygon to
								ensure it is closed at all times.
								The CP mode string is not affected by the PICKADD System Variable.
								Caution: Only objects visible in the drawing area at the time of
								selection will be selected by this method. Consider temporarily zooming
								to the selection window before performing the selection, and then zoom
								previous to restore the original screen position.
						- ":D"	Allow Duplicates
								Includes duplicate selected entities in the selection, else duplicates
								are ignored.
						- ":E"	Everything within Aperture
								Allows selection of everything within the cursor's object selection
								pickbox. This mode may be used in conjunction with the "+." and ":S"
								mode strings to emulate entsel selection behaviour.
						- "F"	Fence
								Selects all objects crossing a selection fence. The Fence method is
								similar to CP (Crossing Polygon) except that AutoCAD does not close the
								fence, and a fence can cross itself.
								Fence is not affected by the PICKADD System Variable.
								Caution: Only objects visible in the drawing area at the time of
								selection will be selected by this method. Consider temporarily zooming
								to the selection window before performing the selection, and then zoom
								previous to restore the original screen position.
						- "G"	Groups
								Selects all objects within a specified group.
								Although a valid ssget mode string, there is no provision for passing
								group names as arguments to the ssget function and hence this option is
								only of use at the command-line during the Select objects prompt.
						- "I"	Implied
								Implied selection (objects selected while PICKFIRST is in effect).
						- "L"	Last
								Selects the last visible object added to the drawing database.
								Caution: when using the "L" selection method in an MDI environment, you
								cannot always count on the last object drawn to remain visible. For
								example, if your application draws a line, and the user subsequently
								minimizes or cascades the AutoCAD drawing window, the line may no longer
								be visible. If this occurs, ssget with the "L" option will return nil.
						- ":L"	Exclude Locked Layers
								Rejects selection of objects residing on locked layers.
						- "M"	Multiple
								Specifies multiple points without highlighting the objects, thus
								speeding up the selection process for complex objects. The Multiple
								method also selects two intersecting objects if the intersection point
								is specified twice.
						- ":N"	Nested
								Call ssnamex for additional information on container blocks and
								transformation matrices for any entities selected during the ssget
								operation. This additional information is available only for entities
								selected via graphical selection methods such as Window, Crossing, and
								point picks.
								Unlike the other object selection methods, :N may return multiple
								entities with the same entity name in the selection set. For example,
								if the user selects a subentity of a complex entity such as a
								BlockReference, PolygonMesh, or old style polyline, ssget looks at the
								subentity that is selected when determining if it has already been
								selected. However, ssget actually adds the main entity (BlockReference,
								PolygonMesh, etc.) to the selection set. The result could be multiple
								entries with the same entity name in the selection set (each will have
								different subentity information for ssnamex to report).
								This ssget mode string is known to perform erratically.
						- "P"	Previous
								Selects the most recent selection set.
								The Previous selection set is cleared by operations that delete objects
								from the drawing. AutoCAD keeps track of whether each selection set was
								specified in model space or paper space. The Previous selection set is
								ignored if you switch spaces.
						- ":P"	Reject Viewports
								Rejects selection of Viewport objects.
								Equivalent to: (ssget '((0 . "~VIEWPORT")))
						- ":R"	Permit Long Transaction
								Allows entities in a long transaction to be selected.
						- ":S"	Single Selection
								The user is permitted a single attempt to make a selection of objects
								using any available selection method. When combined with either "+." or
								":E", only a single object may be selected, emulating an entsel.
						- ":U"	Enable Subentity Selection - 2006+
								Cannot be combined with the duplicate (":D") or nested (":N") selection
								modes.
								In this mode, top-level entities are selected by default, but the user
								can attempt to select subentities by pressing the CTRL key while making
								the selection. This option is supported only with interactive selection,
								such as window, crossing, and polygon. It is not supported for all,
								filtered, or group selections.
						- ":V"	Force Subentity Selection - 2006+
								Treats all interactive, graphic selections performed by the user as
								subentity selections.
								The returned selection set contains subentities only. This option cannot
								be combined with the duplicate (":D") or nested (":N") selection modes.
								This option is supported only with interactive selections, such as
								window and crossing. It is not supported for all, filtered, or group
								selections.
						- "W"	Window
								Selects all objects residing completely inside a rectangle defined by 2
								UCS points.
								Caution: Only objects visible in the drawing area at the time of
								selection will be selected by this method. Consider temporarily zooming
								to the selection window before performing the selection, and then zoom
								previous to restore the original screen position.
						- "WP"	Window Polygon
								Selects objects completely inside a polygon defined by a list of points.
								The polygon can be any shape but cannot cross or touch itself. AutoCAD
								will construct the last segment of the polygon to ensure it is closed at
								all times. WPolygon is not affected by the PICKADD System Variable.
								Caution: Only objects visible in the drawing area at the time of
								selection will be selected by this method. Consider temporarily zooming
								to the selection window before performing the selection, and then zoom
								previous to restore the original screen position.
						- "X"	Extended search (Entire Drawing Database)
								Iterates over the entire drawing database selection all entities
								matching the criteria given by the supplied filter list (if present),
								includes entities on layers that are off, frozen & locked, and entities
								outside of the visible drawing area.

				Voici une liste non-exhaustive des opérateurs de la liste de filtre de (ssget), proposée par LeeMac :
						- "*"	Anything goes (always true)
								Example:
							>	(ssget '((0 . "LINE") (-4 . "=,*,=") (10 1.0 0.0 1.0)))
								Select lines with start point passing through (1.0,*,1.0) i.e. with any
								Y-coordinate.
						- "="	Equal
								Example:
							>	(ssget '((0 . "CIRCLE") (-4 . "*,*,=") (10 0.0 0.0 4.0)))
								Select circles with a center at an elevation of 4.0 units.
						- "!="	Not Equal
						  "/="		All three listed operators are equivalent.
						  "<>"		Example:
							>	(ssget '((0 . "CIRCLE") (-4 . "<>") (40 . 5.0)))
								Select circles with a radius not equal to 5.0.
						- "<"	Less Than
								Example:
							>	(ssget '((0 . "ARC") (-4 . "<") (40 . 2.0)))
								Select arcs with a radius less than 2.0.
						- "<="	Less Than or Equal to
								Example:
							>	(ssget '((0 . "TEXT") (-4 . "*,<=") (11 0.0 10.0 0.0)))
								Select text with alignment point with Y-coordinate less than or equal
								to 10.0 units, with any X & Z coordinate value.
						- ">"	Greater Than
								Example:
							>	(ssget '((0 . "LINE") (-4 . ">,>") (11 3.0 3.0 0.0)))
								Select lines with end point passing through a point with X & Y
								coordinate greater than (3.0,3.0), with any Z-coordinate value.
						- ">="	Greater Than or Equal to
								Example:
							>	(ssget '((0 . "POINT") (-4 . "<,>=,=") (10 5.0 7.0 0.0)))
								Select points with X-coordinate less than 5.0, Y-coordinate greater
								than or equal to 7.0, and with Z-coordinate equal to 0.0.
						- "&"	Bitwise AND (integer groups only)
								Equivalent to: (/= 0 (logand bit filter))
								Example:
							>	(ssget '((0 . "POLYLINE") (-4 . "&") (70 . 6)))
								Select Polylines with either curve-fit (2) or spline-fit (4) vertices
								added.
						- "&="	Bitwise Masked Equals (Integer groups only)
								Equivalent to: (= filter (logand bit filter))
								Example:
							>	(ssget '((0 . "LWPOLYLINE") (-4 . "&=") (70 . 1)))
								Select closed LWPolylines.
						- "<AND...AND>"	Logical AND
								Matches all enclosed expressions.
								Since the ssget filter list has an implied AND operator (matching all
								supplied items), this operator is mostly used in conjunction with other
								logical operators to form compound filters.
								Example:
							>	(ssget
								   '(
								        (-4 . "<OR")
								            (-4 . "<AND") (0 . "ARC")    (40 . 1.5) (-4 . "AND>")
								            (-4 . "<AND") (0 . "CIRCLE") (40 . 2.0) (-4 . "AND>")
								        (-4 . "OR>")
								    )
								)
								Selects arcs with radius 1.5 or circles with radius 2.0.
						- "<OR...OR>"	Logical Inclusive OR
								Matches one or more enclosed expressions.
								Example:
							>	(ssget
								   '(
									(0 . "TEXT")
								   	(-4 . "<OR") (40 . 1.0) (8 . "0") (62 . 3) (-4 . "OR>")
								    )
								)
								Selects text objects with text height of 1.0 or layer "0", or with
								colour set to 3 (green), or a combination of all of these properties.
						- "<XOR...XOR>"	Logical Exclusive OR
								Matches one of two enclosed expressions.
								Example:
							>	(ssget '((0 . "TEXT") (-4 . "<XOR") (40 . 1.0) (62 . 3) (-4 . "XOR>")))
								Selects text with text height of 1.0 or with colour set to 3, but not
								both.
						- "<NOT...NOT>"	Logical NOT
								Rejects objects matching the single enclosed expression.
								Example:
							>	(ssget '((0 . "LINE") (-4 . "<NOT") (62 . 256) (-4 . "NOT>")))
								Selects lines with colour not set to 256 (ByLayer).
			(type arg-lst) = 'LST	| Ex. :	'("_X" ((0 . "*LINE") (62 . 1) (70 . 0))), nil, ...

		¤ flg-lst	> correspond à la liste des attributs/propriétés sous forme de liste de paires pointées (tag . value)
				pour filtrer la sélection en fonction du mode spécifié. Selon le mode de sélection choisi, les paires
				pointées seront comparer à différentes listes possibles :
					- mode = "BLC"	-> flg-lst est comparée à la liste des propriétés de l'objet disponibles via la
							fonction (vlax-dump-object) pour permettre un filtre sur des propriétés non
							accessibles depuis la liste DXF de l'objet (cf. filter-list (ssget)).
					- mode = "ATT"	-> flg-lst est comparée à la liste des attributs de l'objet (get-att-list) pour
							permettre un filtre sur le nom et/ou la valeur d'un ou plusieurs attribut.
					- mode = "DYN"	-> flg-lst est comparée à la liste des attributs de l'objet (get-dynprop-list)
							pour permettre un filtre sur le nom et/ou la valeur d'une ou plusieurs propriété
							dynamique.
					- mode = "DXF"	-> flg-lst est comparée à l'ensemble des propriétés de l'objet correspondant à
							(append (get-att-list) (get-dynprop-list)) afin de permettre un filtre sur
							l'ensemble des propriétés autres que la liste DXF.
			(type flg-lst) = 'LST	| Ex. :	nil, '(("Num*" . "##") ("A" . "[0-9]")), ...

		¤ flag		> permet d'afficher ou non le décompte des objets
			(type flag) = 'SYM	| Ex. :	T si l'on souhaite afficher la décomposition du jeu de sélection, nil sinon.

--- Liste des fonctions (définies localement par la fonction)
	¤ "UtDac" ---> str2lst					| v1.0.0 - ##/##/#### ((gile))
	¤ "UtDac" ---> lst2str					| v1.0.0 - 19/04/2021 (Luna)
	¤ "BaLst" ---> modf-ss					| v1.0.0 - 19/04/2021 (Luna)
	¤ "BaLst" ---> KeyList-Gen				| v1.0.0 - 19/04/2021 (Luna)
	¤ "BaEqc" ---> check-list				| v1.0.0 - 19/04/2021 (Luna)
	¤ "VlPrp" ---> vlax-dump-object->list	| v#.#.# - 15/12/2016 (LeeMac)
	¤ "VlPrp" ---> get-att-list				| v1.1.0 - 14/09/2017 (LeeMac)
	¤ "VlPrp" ---> get-DynProp-list			| v1.1.0 - 14/09/2017 (LeeMac)

--- Retour
	La fonction (Select-Filter) renvoie le jeu de sélection filtré selon les critères, ainsi que le décompte des objets dans
	l'historique de commande selon le mode défini en argument.
	Ex. :
   >	(select-filter "BLC" '("*") nil nil t) renvoie <Selection set: 217d> ainsi que le décompte suivant dans l'historique de commande
	(cas d'une pré-sélection d'objets avant lancement de la fonction pour décomposer le jeu de sélection selon le nom des blocs) :
		Nombre d'objet(s) sélectionné(s) = 1116u
		Liste des bloc(s) trouvé(s) :
		  - "Module générique F 2000x992x40" (448u - 40.14%)
		  - "SUNGROW - Eclisse" (162u - 14.52%)
		  - "SUNGROW - Fixation structure primaire" (16u - 1.43%)
		  - "SUNGROW - Flotteur (Ext.)" (40u - 3.58%)
		  - "SUNGROW - Flotteur (Int.)" (224u - 20.07%)
		  - "SUNGROW - Structure d'arrimage (E-W)" (8u - 0.72%)
		  - "SUNGROW - Structure d'arrimage (N-S)" (18u - 1.61%)
		  - "SUNGROW - Structure primaire (6.37m)" (120u - 10.75%)
		  - "SUNGROW - Structure secondaire (4.25m)" (16u - 1.43%)
		  - "SUNGROW - Structure secondaire (6.38m)" (64u - 5.73%)

   >	(select-filter "ATT" '("*") '("_X") '(("A" . "*")) t) renvoie <Selection set: 219d> ainsi que (sélection de la totalité des
	blocs possédant un attribut nommé "A", quelque soit sa valeur) :
		Nombre d'objet(s) sélectionné(s) = 97u
		Liste des attribut(s) trouvé(s) :
		  - "A" = 01 (1u - 1.03%)
		     -> "Repère" (1u - 100%)
		  - "A" = 02 (1u - 1.03%)
		     -> "Repère" (1u - 100%)
		  - "A" = 03 (1u - 1.03%)
		     -> "Repère" (1u - 100%)
		  - "A" = 04 (1u - 1.03%)
		     -> "Repère" (1u - 100%)
		  - "A" = 05 (1u - 1.03%)
		     -> "Repère" (1u - 100%)
		  - "A" = 06 (1u - 1.03%)
		     -> "Repère" (1u - 100%)
		  - "A" = 07 (1u - 1.03%)
		     -> "Repère" (1u - 100%)
		  - "A" = 08 (1u - 1.03%)
		     -> "Repère" (1u - 100%)
		  - "A" = 09 (1u - 1.03%)
		     -> "Repère" (1u - 100%)
		  - "A" = 1 (8u - 8.25%)
		     -> "Repère" (8u - 100%)
		  - "A" = 10 (7u - 7.22%)
		     -> "Repère" (7u - 100%)
		  - "A" = 11 (1u - 1.03%)
		     -> "Repère" (1u - 100%)
		  - "A" = 12 (1u - 1.03%)
		     -> "Repère" (1u - 100%)
		  - "A" = 13 (1u - 1.03%)
		     -> "Repère" (1u - 100%)
		  - "A" = 14 (1u - 1.03%)
		     -> "Repère" (1u - 100%)
		  - "A" = 15 (1u - 1.03%)
		     -> "Repère" (1u - 100%)
		  - "A" = 16 (1u - 1.03%)
		     -> "Repère" (1u - 100%)
		  - "A" = 17 (1u - 1.03%)
		     -> "Repère" (1u - 100%)
		  - "A" = 18 (1u - 1.03%)
		     -> "Repère" (1u - 100%)
		  - "A" = 19 (1u - 1.03%)
		     -> "Repère" (1u - 100%)
		  - "A" = 2 (6u - 6.19%)
		     -> "Repère" (6u - 100%)
		  - "A" = 20 (1u - 1.03%)
		     -> "Repère" (1u - 100%)
		  - "A" = 21 (1u - 1.03%)
		     -> "Repère" (1u - 100%)
		  - "A" = 22 (1u - 1.03%)
		     -> "Repère" (1u - 100%)
		  - "A" = 23 (1u - 1.03%)
		     -> "Repère" (1u - 100%)
		  - "A" = 24 (1u - 1.03%)
		     -> "Repère" (1u - 100%)
		  - "A" = 25 (1u - 1.03%)
		     -> "Repère" (1u - 100%)
		  - "A" = 26 (1u - 1.03%)
		     -> "Repère" (1u - 100%)
		  - "A" = 27 (1u - 1.03%)
		     -> "Repère" (1u - 100%)
		  - "A" = 28 (1u - 1.03%)
		     -> "Repère" (1u - 100%)
		  - "A" = 29 (1u - 1.03%)
		     -> "Repère" (1u - 100%)
		  - "A" = 3 (6u - 6.19%)
		     -> "Repère" (6u - 100%)
		  - "A" = 30 (1u - 1.03%)
		     -> "Repère" (1u - 100%)
		  - "A" = 31 (1u - 1.03%)
		     -> "Repère" (1u - 100%)
		  - "A" = 32 (1u - 1.03%)
		     -> "Repère" (1u - 100%)
		  - "A" = 33 (1u - 1.03%)
		     -> "Repère" (1u - 100%)
		  - "A" = 4 (6u - 6.19%)
		     -> "Repère" (6u - 100%)
		  - "A" = 5 (6u - 6.19%)
		     -> "Repère" (6u - 100%)
		  - "A" = 6 (6u - 6.19%)
		     -> "Repère" (6u - 100%)
		  - "A" = 7 (6u - 6.19%)
		     -> "Repère" (6u - 100%)
		  - "A" = 8 (6u - 6.19%)
		     -> "Repère" (6u - 100%)
		  - "A" = 9 (6u - 6.19%)
		     -> "Repère" (6u - 100%)
		  - "A" = C (2u - 2.06%)
		     -> "Repère" (2u - 100%)

   >	(select-filter "DXF" nil nil '((8 . "UBS-*")) T) renvoie <Selection set: 21a8> ainsi que (pré-sélection d'objet pour ne
	conserver que les objets présents sur des calques dont le nom commence par "UBS-") et strictement équivalent à
	(select-filter "DXF" '(8) '(((8 . "UBS-*"))) nil T) :
		Nombre d'objet(s) sélectionné(s) = 2207u
		Liste des propriété(s) d'objet trouvée(s) :
		  - 8 = UBS-100-Cotation (20u - 0.91%)
		     -> "DIMENSION" (20u - 100%)
		  - 8 = UBS-100-Ensemble structurel (Ponton) (113u - 5.12%)
		     -> "INSERT" (113u - 100%)
		  - 8 = UBS-100-Modules (48u - 2.17%)
		     -> "LWPOLYLINE" (48u - 100%)
		  - 8 = UBS-100-Structure eclisse (32u - 1.45%)
		     -> "INSERT" (32u - 100%)
		  - 8 = UBS-100-Structure flottante (Ext.) (31u - 1.4%)
		     -> "INSERT" (31u - 100%)
		  - 8 = UBS-100-Structure flottante (Int.) (28u - 1.27%)
		     -> "INSERT" (28u - 100%)
		  - 8 = UBS-100-Structure primaire (6.37m) (20u - 0.91%)
		     -> "INSERT" (20u - 100%)
		  - 8 = UBS-100-Structure primaire (7.13m) (1u - 0.05%)
		     -> "INSERT" (1u - 100%)
		  - 8 = UBS-100-Structure secondaire (4.25m) (12u - 0.54%)
		     -> "INSERT" (12u - 100%)
		  - 8 = UBS-300-Tranchées (Coupes) (1872u - 84.82%)
		     -> "ARC" (534u - 28.53%)
		     -> "DIMENSION" (45u - 2.4%)
		     -> "HATCH" (15u - 0.8%)
		     -> "INSERT" (109u - 5.82%)
		     -> "LWPOLYLINE" (1124u - 60.04%)
		     -> "MTEXT" (7u - 0.37%)
		     -> "MULTILEADER" (32u - 1.71%)
		     -> "SOLID" (6u - 0.32%)
		  - 8 = UBS-900-Fenêtre de Présentation (30u - 1.36%)
		     -> "CIRCLE" (16u - 53.33%)
		     -> "LWPOLYLINE" (13u - 43.33%)
		     -> "MTEXT" (1u - 3.33%)

   >	(select-filter "BLC" '("Module*") '(((8 . "0,UBS-100-*"))) nil T) renvoie <Selection set: 21bf> ainsi que (pas de pré-sélection
	donc seuls les blocs dont le nom commence par "Module" et qui sont situés sur les calques "0" ou commençant par "UBS-100-") :
		Sélectionner des objets: Spécifiez le coin opposé: 4233 trouvé(s), 9 groupes
		Sélectionner des objets:
		Nombre d'objet(s) sélectionné(s) = 4032u
		Liste des bloc(s) trouvé(s) :
		  - "Module générique F 2000x992x40" (4032u - 100%)

   >	(select-filter "BLC" '("Module*") '(((8 . "0,UBS-100-*"))) nil nil) renvoie <Selection set: 21bf> ainsi que (sélection identique
	à la précédente) : 4032 trouvé(s) correspondant au retour de la fonction (ssget) (donc le nombre affiché peut être différent).

--- Modifications apportées par rapport à la version précédente
	> Refonte totale de la fonction pour permettre une utilisation plus complète et plus riche. Ajout d'un argument !!!

Si jamais vous avez quelques difficultés à l'utilisation, je peux expliciter un peu mieux que chat au cas par cas au besoin !

Bisous,
Luna

DtSel ¤ Select-Filter (3.0.0 - 20-04-2021).lsp

Lien vers le commentaire
Partager sur d’autres sites

  • 9 mois après...

Bonjour Luna,

Je cherchais à pouvoir sélectionner uniquement des bloc avec une certaine valeur d'attribut, donc vraiment bien ta fonction, MERCI, juste maintenant il a creer un <Selection set: 219d> mais comment l'utiliser ou le rappeler pour en faire ce qu'on veut derrière hors script (perso j'ai besoin de copier et coller avec le point d'origine)

Je te souhaite une excellente journée

Cordialement

Lien vers le commentaire
Partager sur d’autres sites

Bon je me réponds à moi meme, c'est deja selectionnée Xd 

(pour ma petite défense c'était des points de GPS recollement donc si typePT mal réglé on ne vois pas s'ils sont sélectionnés ...

En tout cas merci pour ce Lisp ça m'a éviter de chercher à la main 240 points parmi 4000.

D'ailleurs la fonction filtre ne peux pas le faire (prendre uniquement les bloc ayant un attribut spécifié ayant une valeur commençant par....)?

perso pas réussi

Bonne journée et encore merci

Lien vers le commentaire
Partager sur d’autres sites

Coucou,

Vui je n'ai pas trouvé de méthode pour le faire en version normale via la commande FILTRE ou SELECTRAP...
En effet la fonction (select-filter) renvoie le jeu de sélection (pour le développeur) et rend la sélection courante (pour l'utilisateur). Elle n'est franchement pas évidente à utiliser malheureusement, bien que son utilisation ait pour but d'être utile, donc je suis contente de voir que tu as réussi 😉

Évidemment, elle n'est pas encore suffisamment au point et nécessite encore de nombreuses updates/améliorations avant d'être comme je le souhaite mais bon...quand le temps m'en laissera la chance >w<

Bisous,
Luna

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é