Aller au contenu

[RESOLU] Exporter des surfaces


Hydro8

Messages recommandés

Bonjour

 

Gros sujet que celui là, il s'agit de l'export des surfaces d'un plan.

 

Pour le moment on le fait avec Covadis, mais au vu des derniers changements de politique,

nous essayons de trouver à faire certaines choses par nous même.

 

Donc là l'idée serait d'exporter la surface des pièces dans un XLS ou CSV (voir DOC).

 

Voici le mode de fonctionnement de Covadis :

- on sélectionne les polylignes : il faut un calque par appartement.

- on sélectionne le calque avec le texte des pièces.

Et il nous sort un listing avec les surfaces de chaque pièce groupées par appartement.

 

Pensez-vous que quelque chose de semblable est possible en LISP ?

A votre connaissance quelqu'un a déjà réalisé quelque chose comme cela ?

 

Merci de votre aide.

Lien vers le commentaire
Partager sur d’autres sites

Hello

 

1) Tu n envisages quand meme pas de remplacer Covadis (environ 3-4 millions de Lignes ARX C+ sans les commentaires) !?

 

Et le nouveau GeoGexFr (nomme avant GeoFoncia) de Geomedia ne t interesse pas !?

Je ne sais pas si GeoGexFr (nomme avant GeoFoncia) traite les maisons / appartements !?

 

2) Au fait tu as un AutoCAD "simple" ou un AutoCAD MAP ??

 

3) Apres il y a depuis longtemps qq routines Lisp interessantes "plus ou moins" proches de ce que tu demandes ...

Voila les routines Lisp que j utilise ...

 

4) Routines : ZTOTM , ZTOTCM , ZTOTMM - Resultat sur Ecran Texte (F2)

Pour avoir en M lineaire et en M2, le Total des Longueurs / Perimetres et Aires / Surfaces des objets selectionnes

suivant que le DWG est en M ou en CM ou en MM ...

 

5) Routines : TSUR_PL_LAY - Resultat sur Ecran Texte (F2) - MERCI Gilles !

Pour avoir en M2 les Aires / Surfaces par Calque des Polylignes et Cercles selectionnes ...

TSUR_PL_LAY est pour un DWG en Metre. Mais si tu veux pour un DWG en CM ou MM, je peux adapter !?

-- Donc si tu as des Noms de Calques SUBTILS !

 

6) J ajoute aussi TLEN_PL_LAY - Resultat sur Ecran Texte (F2) - MERCI Gilles !

Pour avoir en M les Longueurs / Perimetres par Calque des Polylignes selectionnes ...

TLEN_PL_LAY est pour un DWG en Metre. Mais si tu veux pour un DWG en CM ou MM, je peux adapter !?

-- Donc si tu as des Noms de Calques SUBTILS !

 

7) Gilles a developpe 2 trucs interessants et "sophistiques" : TotalArea et TotalPerim v4.06

https://cadxp.com/topic/14427-lisps-de-gile/

 

Mais sur le site de Gilles, tu as les versions v4.10 de 03/2017 !

http://gilecad.azurewebsites.net/Lisp.aspx

 

En esperant que cela puisse t'aider !? ... Apres j ai encore d'autres trucs !

 

La Sante, Bye, lecrabe "fatigue"

LSP_Patrice_5_Routines.zip

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Je te remercie de ta réponse.

 

Je ne compte pas du tout remplacer Covadis, mais chez nous le prix est augmenté de 460%

... Autant dire que nous essayons de réduire au maximum le nombre de licence,

notamment pour les ordinateurs qui l'utilisent que pour des opérations "basiques".

 

Merci pour l'ensemble de ces liens qu'il va falloir que j'analyse.

Lien vers le commentaire
Partager sur d’autres sites

Hello Hydro8 / Hydro88

 

Si tu as trouve un Lisp interessant, SVP tu le joins a ton message en ZIP !

Ou sinon par un Lien Download Free, WETransfert, etc ...

 

Parles tu du/des Lisp(s) de CE sujet :

https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/export-polyline-data-area-layer-and-inner-text-to-excel/td-p/8254926

Voir la Super Routine EPD de Kent1Cooper ou de Dlanorh ...

 

Humour : avec mes copains de la CIA / NSA , nous te pistons !

 

La Sante, Bye, lecrabe "fatigue"

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Coucou,

 

Contrairement à lecrabe, je ne possède pas de bibliothèque de 3001 routines donc je ne peux pas te proposer quelque chose de tout fait à modifier légèrement mais je peux en écrire une au besoin.

Pour cela j'ai besoin d'un peu plus de précision :3

Pour commencer, si je comprends bien tu as besoin d'un rendu comme suit :

Appartement 01

Pièce 01 = ... m²

Pièce 02 = ... m²

Appartement 02

Pièce 01 = ... m²

Pièce 02 = ... m²

Pièce 03 = ... m²

Pièce 04 = ... m²

Appartement 03

Pièce 01 = ... m²

Avec le nom "Appartement ##" correspondant au final au nom du calque des polylignes (est-il préférable pour toi de sélectionner une polyligne de chaque calque, ou bien le(s) calque(s) dans une liste de calques ?) et le nom "Pièce ##" correspondant au texte présent dans les objets "MTEXT" ou "TEXT" du dessin. Ces fameux textes ont un unique calque, non lié au calque d'appartement si je comprend bien mais sont situés dans l'emprise de la polyligne pour chaque pièce ?

Comment sont fabriqués ces textes ? Il possède le nom de la pièce, la surface de la pièce, une autre info ?

Est-il possible qu'un appartement possède deux pièces distinctes possédant la même dénomination ? Si oui, faut-il regrouper les deux surfaces en une seule ou bien les conserver séparées ?

 

Concernant les infos, tu as besoin uniquement de la surface ou bien le périmètre est utile ? L'historique de commande est-il suffisant ou bien il te faut un fichier d'extraction (.txt, .csv, ... ?) ?

Je me suis déjà penchée sur des problématiques similaires avec gestions de listes/sous-listes triées

 

Bisous, Luna

Lien vers le commentaire
Partager sur d’autres sites

Hello Hydro8 / Hydro88

 

SVP tu regardes bien l Image jointe ... Elle illustre parfaitement une routine LSP que j ai en Stock !

Cette routine genere un "joli" Tableau AutoCAD trie par le Texte du calque _numLay ...

 

Avec 3 Textes DANS chaque Polyligne 2D ...

Donc il suffirait d'ameliorer la routine pour generer en plus un fichier .CSV ...

 

(setq _dec "2")

(setq _numLay "TEXT_NUMBER")

(setq _typeLay "TEXT_TYPE")

(setq _areaLay "TEXT_AREA")

(setq _polyLay "ROOM_POLYGON")

 

Comme tu le vois, on peut parametrer dans le code Lisp :

- Le nombre de decimales

- Le calque de chaque Texte avec un calque different bien sur

- Le calque des Polylignes 2D

 

Est ce que cette routine t'interesse ??

Routine tiree de mon stock de 3001 routines ...

 

Je suis SUR que Luna pourra ameliorer / corriger cette routine suivant TES besoins !?

1 - Generer un CSV

2 - Gerer les Regroupements !?

 

La Sante, Bye, lecrabe "fatigue"

DWG_avec_Tableau_en_Image_30.jpg

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

On peut même traiter ça avec une version LT (puisqu'on parle économie) !

 

Voici

sur le principe du calcul de surfaces, voir également de volumes et de quantitatif... le tout avec une version LT !

 

Christian

Formateur, Consultant Expert AutoCAD, REVIT MEP, INVENTOR, télécharger , des Outils AutoCAD...

cad123 @ wanadoo.fr (enlever les espaces de part et d'autre de @)

Lien vers le commentaire
Partager sur d’autres sites

Coucou,

 

Contrairement à lecrabe, je ne possède pas de bibliothèque de 3001 routines donc je ne peux pas te proposer quelque chose de tout fait à modifier légèrement mais je peux en écrire une au besoin.

Pour cela j'ai besoin d'un peu plus de précision :3

Pour commencer, si je comprends bien tu as besoin d'un rendu comme suit :

 

Avec le nom "Appartement ##" correspondant au final au nom du calque des polylignes (est-il préférable pour toi de sélectionner une polyligne de chaque calque, ou bien le(s) calque(s) dans une liste de calques ?) et le nom "Pièce ##" correspondant au texte présent dans les objets "MTEXT" ou "TEXT" du dessin. Ces fameux textes ont un unique calque, non lié au calque d'appartement si je comprend bien mais sont situés dans l'emprise de la polyligne pour chaque pièce ?

Comment sont fabriqués ces textes ? Il possède le nom de la pièce, la surface de la pièce, une autre info ?

Est-il possible qu'un appartement possède deux pièces distinctes possédant la même dénomination ? Si oui, faut-il regrouper les deux surfaces en une seule ou bien les conserver séparées ?

 

Concernant les infos, tu as besoin uniquement de la surface ou bien le périmètre est utile ? L'historique de commande est-il suffisant ou bien il te faut un fichier d'extraction (.txt, .csv, ... ?) ?

Je me suis déjà penchée sur des problématiques similaires avec gestions de listes/sous-listes triées

 

Bisous, Luna

 

Merci pour ton intérêt !

 

- Pour la selection du calque, on peut même faire une selection arbitraire avec un wildcard. Par exemple tous les calques "SURFACES_APPART*".

- Tu as bien compris pour le texte. Ils sont effectivement tous regroupés dans un calque unique et chaque pièce possède un texte.

- Pour le moment il s'agit d'un simple text ("Séjour" par exemple) sans autre information. Est-il possible d'utiliser un mText ? (sans forcément plus d'information)

- Il n'y a qu'un type de texte par appartement. Si une pièce se présente plusieurs fois, on met un numéro (chambre 1, chambre 2). Si une surface est coupée en deux, on détour l'obstacle.Par contre il arrive que certaine surface ne possède pas de texte. Dans ce cas elles sont listées indépendamment sans nom spécifique.

- La surface et le périmètre sont nécessaires comme information. Si cela est possible, il serait super d'avoir le total par appartement ainsi que le nombre de polyligne composant ce total.

- Il faudrait un export csv afin de pouvoir l'importer dans excel.

 

Je ne sais pas si un changement de méthodologie pourrait simplifier le processus ?

Lien vers le commentaire
Partager sur d’autres sites

Hello Hydro8 / Hydro88

 

Si tu as trouve un Lisp interessant, SVP tu le joins a ton message en ZIP !

Ou sinon par un Lien Download Free, WETransfert, etc ...

 

Parles tu du/des Lisp(s) de CE sujet :

https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/export-polyline-data-area-layer-and-inner-text-to-excel/td-p/8254926

Voir la Super Routine EPD de Kent1Cooper ou de Dlanorh ...

 

Humour : avec mes copains de la CIA / NSA , nous te pistons !

 

La Sante, Bye, lecrabe "fatigue"

 

Merci de passer par là :)

 

La CIA / NSA s'est trompée :P

 

Voilà le fichier zip que j'ai oublié la dernière fois.

 

Hello Hydro8 / Hydro88

 

SVP tu regardes bien l Image jointe ... Elle illustre parfaitement une routine LSP que j ai en Stock !

Cette routine genere un "joli" Tableau AutoCAD trie par le Texte du calque _numLay ...

 

Avec 3 Textes DANS chaque Polyligne 2D ...

Donc il suffirait d'ameliorer la routine pour generer en plus un fichier .CSV ...

 

(setq _dec "2")

(setq _numLay "TEXT_NUMBER")

(setq _typeLay "TEXT_TYPE")

(setq _areaLay "TEXT_AREA")

(setq _polyLay "ROOM_POLYGON")

 

Comme tu le vois, on peut parametrer dans le code Lisp :

- Le nombre de decimales

- Le calque de chaque Texte avec un calque different bien sur

- Le calque des Polylignes 2D

 

Est ce que cette routine t'interesse ??

Routine tiree de mon stock de 3001 routines ...

 

Je suis SUR que Luna pourra ameliorer / corriger cette routine suivant TES besoins !?

1 - Generer un CSV

2 - Gerer les Regroupements !?

 

La Sante, Bye, lecrabe "fatigue"

 

Super routine, comme d'habitude. Effectivement il faut que je vois comment regrouper par calque et générer un csv.

 

Merci !

Export.zip

Lien vers le commentaire
Partager sur d’autres sites

Hello

 

La routine Lisp dans EXPORT.zip est bien la Super Routine EPD de Dlanorh !

https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/export-polyline-data-area-layer-and-inner-text-to-excel/td-p/8254926

 

Alors Hydro8 et Hydro88 sont (ou ne sont pas) des personnes differentes !?

 

La Sante, Bye, lecrabe "fatigue"

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Coucou,

 

Je peux éventuellement te proposer ceci :

;; Dans le but d'une généralisation du programme, la sélection des calques/polylignes peut se faire selon 3 différents modes :		;;
;;																	;;
;;	Le programme ouvre en premier lieu une boîte de dialogue pour la sélection multiple des calques. En suivant ce mode,		;;
;;	l'ensemble des polylignes présentes sur ce(s) calque(s) seront prise en compte pour l'exportation des données. Si cette		;;
;;	méthode ne convient pas à l'utilisateur, il suffit de valider à vide (pas de calque sélectionné) ou d'annuler la BdL.		;;
;;																	;;
;;	Si aucun calque n'a été sélectionné via la BdL, le programme demande alors de sélectionner manuellement des polylignes,		;;
;;	qui sont filtrées par défaut pour des calques suivant la dénomination "SURFACES_APPART*". Il est également possible de		;;
;;	ne sélectionner aucune polyligne afin de sélectionner automatiquement la totalité des polylignes présentes dans les		;;
;;	calques suivant la dénomination "SURFACE_APPART*".										;;
;;																	;;
;;	Si la dénomination des calques ne convient pas, il est possible de modifier la valeur par défaut en modifiant le filtre		;;
;;	(ssget) de la forme (8 . "SURFACES_APPART*") et donc de remplacer "SURFACES_APPART*" par la dénomination souhaitée.		;;
;;	Ceci est également possible pour le filtre des "TEXT" et "MTEXT" (8 . "*") pour afiner la recherche et la rapidité.		;;
;;																	;;
;;	Concernant la création du fichier .csv, celui-ci utilise le dossier du fichier .dwg par défaut ainsi que le nom du fichier	;;
;;	.dwg comme nom par défaut, il est donc possible d'éxécuter la commande rapidement en effectuant une succession de 3 		;;
;;	validations à vide, ce qui permettra d'exporter l'ensemble des surfaces des polylignes de chaque pièce pour l'ensemble des	;;
;;	calques nommés "SURFACES_APPART*".												;;
;;																	;;
;;	Une modification est en cours pour permettre la détection d'îlots au sein d'une pièce et en déduire leur aire à l'aire de	;;
;;	la pièce principale pour permettre un export plus juste.									;;
;;																	;;
;;--- Auteur(e)	: Luna															;;
;;--- Date	: 25/02/2021														;;
;;--- Version	: 1.0.0															;;

(defun c:SURFAREA (/ ListBox str2lst unit-prompt Remove-Double jsel i name obj n ent layer-list area perim pt-list layer txt str lst file)

	;--- LISP de bonusCAD publié sur CADXP.com le 11/01/2016 11:34

	;--- Version modifiée de la fonction (ListBox), possède 5 arguments
;--- title correspond à l'entête de la boîte de dialogue
;--- msg correspond au message affiché au dessus de la liste
;--- lst correspond à la liste à afficher
;--- value correspond à la valeur définie par défaut
;--- flag correspond au type de liste souhaitée
;	flag = 0  ->  liste déroulante (choix unique)
;	flag = 1  ->  liste avec barre de défilement (choix unique)
;	flag = 2  ->  liste avec barre de défilement (choix multiple)

; Renvoie la liste des calques ayant été sélectionnés
(defun ListBox (title msg lst value flag / tmp file DCL_ID choice)

	(setq tmp (vl-filename-mktemp "tmp.dcl")
	      file (open tmp "w")
	)
	(write-line
		(strcat "ListBox:dialog{width=" (itoa (+ (apply 'max (mapcar 'strlen (mapcar 'vl-princ-to-string lst))) 5)) ";label=\"" title "\";")
		file
	)
	(if (and msg (/= msg ""))
		(write-line (strcat ":text{label=\"" msg "\";}") file)
	)
	(write-line
		(cond
			((= 0 flag) "spacer;:popup_list{key=\"lst\";")
			((= 1 flag) "spacer;:list_box{height=15;key=\"lst\";")
			(t "spacer;:list_box{height=15;key=\"lst\";multiple_select=true;")
		)
		file
	)
	(write-line "}spacer;ok_cancel;}" file)
	(close file)
	(setq DCL_ID (load_dialog tmp))
	(if (not (new_dialog "ListBox" DCL_ID))
		(exit)
	)
	(start_list "lst")
	(mapcar 'add_list lst)
	(end_list)
	(if (member value lst) (set_tile "lst" (itoa (vl-position value lst))))
	(action_tile
			"accept"
			"(or 	(= (get_tile \"lst\") \"\")
				(if (= 2 flag)
					(progn
						(foreach n (str2lst (get_tile \"lst\") \" \")
							(setq choice (cons (nth (atoi n) lst) choice))
						)
						(setq choice (reverse choice))
					)
					(setq choice (nth (atoi (get_tile \"lst\")) lst))
				)
			)
			(done_dialog)"
	)
	(start_dialog)
	(unload_dialog DCL_ID)
	(vl-file-delete tmp)
	choice

)

;--- LISP de bonusCAD publié sur CADXP.com le 11/01/2016 11:34

;--- Nécessaire au bon fonctionnement de la fonction (ListBox) ci-dessus

(defun str2lst (str sep / pos)
        (if (setq pos (vl-string-search sep str))
                (cons
                        (substr str 1 pos)
                        (str2lst (substr str (+ (strlen sep) pos 1)) sep)
                )
                (list str)
        )
)

	; Permet d'afficher l'unité de mesure selon la valeur de la variable système "INSUNITS" ou "AUNITS" :
; Création le 21/09/2020 v1.0.0
(defun unit-prompt (flag / u)

	(cond
		((= flag 0)
			(setq u (getvar "INSUNITS"))
		)
		((= flag 1)
			(setq u (getvar "AUNITS"))
		)
	)
	(cond
		((and (= flag 0) (= u 0))
			""
		)
		((and (= flag 0) (= u 1))
			"in"
		)
		((and (= flag 0) (= u 2))
			"ft"
		)
		((and (= flag 0) (= u 3))
			"mi"
		)
		((and (= flag 0) (= u 4))
			"mm"
		)
		((and (= flag 0) (= u 5))
			"cm"
		)
		((and (= flag 0) (= u 6))
			"m"
		)
		((and (= flag 0) (= u 7))
			"km"
		)
		((and (= flag 0) (= u 8))
			"µin"
		)
		((and (= flag 0) (= u 9))
			"Mi"
		)
		((and (= flag 0) (= u 10))
			"yd"
		)
		((and (= flag 0) (= u 11))
			"Å"
		)
		((and (= flag 0) (= u 12))
			"nm"
		)
		((and (= flag 0) (= u 13))
			"µm"
		)
		((and (= flag 0) (= u 14))
			"dm"
		)
		((and (= flag 0) (= u 15))
			"dam"
		)
		((and (= flag 0) (= u 16))
			"hm"
		)
		((and (= flag 0) (= u 17))
			"Gm"
		)
		((and (= flag 1) (= u 0))
			"°"
		)
		((and (= flag 1) (= u 1))
			"\""
		)
		((and (= flag 1) (= u 2))
			"gon"
		)
		((and (= flag 1) (= u 3))
			"rad"
		)
	)

)

	; Supprime les doublons au sein d'une liste spécifiée en argument :
;--- La fonction (Remove-Double) possède 1 argument
;--- lst1 correspond à la liste devant être évaluée pour la suppression des doublons

;--- Renvoie la liste modifiée sans ses doublons
(defun Remove-Double (lst1 / lst2)

	(while (car lst1)
		(setq Lst2 (cons (car lst1) lst2)
		      Lst1 (vl-remove (car lst1) lst1)
		)
	)
	(reverse lst2)

)

; []=================================================[] DEBUT DE LA COMMANDE SURFAREA []=================================================[] ;

(if (or
	(and
	     (setq layer-list	(ListBox "Choix des calques : "
					 "Veuillez choisir le(s) calque(s) des polylignes contenant les surfaces à étudier :"
					 (progn
					 	(setq name (cdr (assoc 2 (tblnext "LAYER" t))))
					 	(while (/= name nil)
							(if (not (wcmatch name "*|*"))
								(setq layer-list (cons name layer-list))
							)
							(setq name (cdr (assoc 2 (tblnext "LAYER"))))
						)
					 	(vl-sort layer-list '<)
					 )
					 nil
					 2
				)
	     )
	     (setq jsel (ssget "_X" (list '(0 . "LWPOLYLINE") (cons 8 (apply 'strcat (mapcar '(lambda (layer) (strcat layer ",")) layer-list))))))
	)
	(setq jsel (ssget '((0 . "LWPOLYLINE") (8 . "SURFACES_APPART*"))))
	(setq jsel (ssget "_X" '((0 . "LWPOLYLINE") (8 . "SURFACES_APPART*"))))
    )
	(progn
		(repeat (setq i (sslength jsel))
			(setq name (ssname jsel (setq i (1- i)))
			      area (vlax-curve-getarea name)
			      perim (vlax-curve-getDistAtParam name (vlax-curve-getEndParam name))
			      pt-list (mapcar 'cdr (vl-remove-if-not '(lambda (e) (= (car e) 10)) (entget name)))
			      layer (cdr (assoc 8 (entget name)))
			      txt nil
			)
;;				(if (or
;;					(and layer-list
;;					     (setq obj (ssget "_WP" (setq pt-list (mapcar '(lambda (pt) (trans pt 0 1)) pt-list)) (list '(0 . "LWPOLYLINE") (cons 8 (apply 'strcat (mapcar '(lambda (layer) (strcat layer ",")) layer-list))))))
;;					)
;;					(setq obj (ssget "_WP" pt-list '((0 . "LWPOLYLINE") (8 . "SURFACES_APPART*"))))
;;				    )
;;					(repeat (setq n (sslength obj))
;;						(setq ent (ssname obj (setq n (1- n)))
;;						      area (- area (vlax-curve-getArea ent))
;;						      jsel (ssdel ent jsel)
;;						      i (1- i)
;;						)
;;					)
;;				)
			(cond
				((and (setq obj (ssget "_CP" pt-list '((0 . "MTEXT,TEXT") (8 . "*"))))
				      (= 1 (sslength obj))
				 )
					(setq txt (substr (setq str (cdr (assoc 1 (entget (ssname obj 0))))) 1 (vl-string-search "\\P" str)))
				)
				((and obj
				      (< 1 (sslength obj))
				 )
					(repeat (setq n (sslength obj))
						(setq ent (ssname obj (setq n (1- n)))
						      txt (cons (substr (setq str (cdr (assoc 1 (entget ent)))) 1 (vl-string-search "\\P" str)) txt)
						)
					)
					(setq txt (vl-string-right-trim " | " (apply 'strcat (vl-sort (mapcar '(lambda (x) (strcat x " | ")) txt) '<))))
				)
				(t
					(setq txt "-")
				)
			)
			(setq lst (cons (cons layer (list txt area perim)) lst))
		)
		(if (and
			(setq layer-list (vl-sort (remove-double (mapcar 'car lst)) '<)
			      file (getfiled "Enregistrement du fichier .csv"
					     (strcat (getvar 'DWGPREFIX) (vl-filename-base (getvar 'DWGNAME)) ".csv")
					     "csv"
					     45
				   )
			      file (open file "w")
			)
			(write-line
				(strcat "Dénomination,Surface (" (unit-prompt 0) "²),Périmètre (" (unit-prompt 0) ")")
				file
			)
			(mapcar
				'(lambda (layer / y txt)
					(setq y (vl-sort (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) layer)) lst)) '(lambda (e1 e2) (< (car e1) (car e2)))))
				 	(if (vl-string-search "_" layer) (setq layer (substr layer (+ 2 (vl-string-position (ascii "_") layer)))))
					(write-line
						(strcat layer "," (rtos (apply '+ (mapcar 'cadr y)) 2 2) "," (rtos (apply '+ (mapcar 'caddr y)) 2 2))
						file
					)
				  	(mapcar '(lambda (r)
							(write-line
								(strcat (car r) "," (rtos (cadr r) 2 2) "," (rtos (caddr r) 2 2))
								file
							)
						)
						y
					)
				)
				layer-list
			)
			(not (close file))
		     )
			(prompt (strcat "\nLe fichier .csv a été créé avec succès pour l'export des calques :"
					(apply 'strcat (mapcar '(lambda (layer) (strcat "\n  - " layer)) layer-list))
				)
			)
			(prompt "\nUne erreur est survenue lors de la création du fichier .csv !")
		)
	)
)
(princ)

)

 

Cela fait un peu usine à gaz, je l'avoue mais c'est rapide à l'exécution ! :3

 

J'ai essaye d'intégrer un système de détection d'îlots interne aux pièces maîtresses pour en déduire leur aire et ainsi permettre l'ajout d'obstacle au sein d'une pièce sans fausser les données mais cela demande une manipulation de liste un peu plus violente et donc l'ajout d'une seconde boucle pour supprimer à partir de la première.

 

En attendant j'ai fait en sorte que le programme puisse fonctionner pour un peu pour tout le monde donc tu as 3 modes de sélection possibles (expliqué dans les commentaires du programme) qui se comporte comme des niveaux de lectures. Si le premier niveau est ignoré alors il passe au second sinon il lance le programme. Donc ces niveaux consiste à :

1er Niveau -> Sélectionner la totalité des polylignes en sélectionnant les calques que l'on veut prendre en compte pour l'export

2nd Niveau -> Sélectionner manuellement les polylignes que l'on souhaite avec un filtre appliqué lors de la sélection sur le nom du calque "SURFACES_APPART*"

3ème Niveau -> Sélectionner la totalité des polylignes sur l'ensemble des calques ayant pour dénomination "SURFACES_APPART*"

 

Ainsi les deux premiers niveaux ont besoin d'une validation/décision de l'utilisateur et le dernier se fait automatiquement. Il est possible d'ignorer les deux premiers en validant à vide donc facile et rapide.

Pour le filtre appliqué sur les textes, je ne connais pas le nom du calque que tu utilises donc actuellement le filtre est appliqué pour prendre tous les calques donc il te faudra ajouter le nom du calque des textes pour ne sélectionner que le nom des pièces.

 

En ensuite tu auras une BdL pour enregistrer ton fichier .csv qui aura le répertoire de ton dessin par défaut et le nom de ton .dwg par défaut donc ici aussi tu peux faire une légère modif' sur le nom et hop validé ! :3

Si tu as des remarques ou améliorations, n'hésites pas !

 

Bisous, Luna

Modifié par Luna
  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

Merci beaucoup Luna !

 

Super lisp ! J'ai pu facilement le modifier pour mettre mes propres wildcards, top !

 

Par contre j'ai essayé de faire une petite modification mais je ne trouve pas :mellow:

 

- Est-il possible de rajouter une colonne "Surface totale" avant la colonne "Surface" et "Périmètre total" avant la colonne "Périmètre" afin de noter la surface totale du calque dans cette colonne et pour les pièces dans les colonnes normales ?

 

- Est-il possible de modifier le nom du calque avant l'insertion dans le tableau ? Par exemple Surface-Appartement A001 devient Appartement A001 ?

 

Merci encore :D :D

Lien vers le commentaire
Partager sur d’autres sites

Coucou,

 

- Est-il possible de rajouter une colonne "Surface totale" avant la colonne "Surface" et "Périmètre total" avant la colonne "Périmètre" afin de noter la surface totale du calque dans cette colonne et pour les pièces dans les colonnes normales ?

Je n'ai pas fait ainsi, en .csv on n'a pas la main sur la mise en page du fichier .xls mais pour les rangées qui porte le nom du calque "SURFACE_APPARTEMENT001" par exemple, tu as le total des pièces qui le compose au-dessous que se soit pour la surface ou le périmètre (cela économise une colonne ^^)

Si je l'avais affiché dans l'historique de commande j'aurais pu faire un peu de mise en page pour faire ressortir ces valeurs voilà tout. Mais du coup tu as déjà cela dans ton fichier d'export.

 

- Est-il possible de modifier le nom du calque avant l'insertion dans le tableau ? Par exemple Surface-Appartement A001 devient Appartement A001 ?

 

Absolument, je ne l'ai pas fait car cela est spécifique mais je peux tricher légèrement :3

J'ai modifier le code au post#14 pour prendre en compte cela en ajoutant la ligne

(if (vl-string-search "_" layer) (setq layer (substr layer (+ 2 (vl-string-position (ascii "_") layer)))))

sur le (mapcar layer). Cela devrait normalement découper le nom des calques à partir du caractère "_", peut importe ce qu'il y a avant ce caractère.

 

Bisous,

Luna

Modifié par Luna
  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

Absolument, je ne l'ai pas fait car cela est spécifique mais je peux tricher légèrement :3

J'ai modifier le code au post#14 pour prendre en compte cela en ajoutant la ligne

(if (vl-string-search "_") (setq layer (substr layer (+ 2 (vl-string-position (ascii "_") layer)))))

sur le (mapcar layer). Cela devrait normalement découper le nom des calques à partir du caractère "_", peut importe ce qu'il y a avant ce caractère.

 

Malheureusement j'ai une erreur lorsque j'essaye cette nouvelle version, au moment de la sauvegarde du fichier : "erreur: nombre d'arguments insuffisants"

Lien vers le commentaire
Partager sur d’autres sites

oups pardon ! c'est corrigé ! :3

 

Merci ça fonctionne au top !

 

Deux dernières questions (j'espère :unsure: ) :

 

- est-il possible de filtrer le texte de la pièce par un calque spécifique ? Nous avons plusieurs textes dans une pièce et du coup ils sont tous présents dans le tableau.

 

- pour un texte multiligne, est-il possible de récupérer que la première ligne ? Afin d'utiliser ce Lisp pour autre chose que de la surface, nous avons parfois des multilignes dont l'information principale est sur la première uniquement. J'imagine que pour enlever le formatage il faut travailler sur la valeur du texte, donc que ce formatage soit toujours le même ?

Lien vers le commentaire
Partager sur d’autres sites

- est-il possible de filtrer le texte de la pièce par un calque spécifique ? Nous avons plusieurs textes dans une pièce et du coup ils sont tous présents dans le tableau.

Le filtre du calque sur le texte est actuellement défini sur "*" à la ligne

((and (setq obj (ssget "_CP" pt-list '((0 . "MTEXT,TEXT") (8 . "*"))))

, le code DXF 8 correspond au filtre que l'on souhaite appliquer à la propriété de calque. Donc si par exemple tous tes textes sont présents sur un calque nommé "ROOM_TXT" alors tu remplaces le "*" par "ROOM_TXT" et si tu as plusieurs calques avec une base identique tu peux utiliser le wildcard "*" comme pour le filtre des polylignes.

 

- pour un texte multiligne, est-il possible de récupérer que la première ligne ? Afin d'utiliser ce lisp pour autre chose que de la surface, nous avons parfois des multilignes dont l'information principale est sur la première uniquement. J'imagine que pour enlever le formatage il faut travailler sur la valeur du texte, donc que ce formatage soit toujours le même ?

Vouih c'est parfaitement faisable, si par exemple la séparation des informations est faite avec un retour à la ligne au sein du MTEXT, alors il suffit de repérer le wildcard "\P" spécifiant un retour à la ligne (et donc de ne prendre que les informations qui le précède.

Un exemple de MTEXT ayant plusieurs lignes avec un retour à la ligne (ENTER) entre chaque :

Commande: (explore-dxf (car (entsel)) 0 nil)
Choix de l'objet:
Explore DXF in progress from "MTEXT" (<Nom d'entité: 2ca3af5bdc0>) :
|      (-1 . <Nom d'entité: 2ca3af5bdc0>)
|      (0 . "MTEXT")
|      (330 . <Nom d'entité: 2c9e0dcd9f0>)
|      (5 . "4BBBA4")
|      (100 . "AcDbEntity")
|      (67 . 0)
|      (410 . "Model")
|      (8 . "0")
|      (48 . 0.5)
|      (100 . "AcDbMText")
|      (10 1.9019e+06 3.16255e+06 0.0)
|      (40 . 1.5)
|      (41 . 23.518)
|      (46 . 0.0)
|      (71 . 1)
|      (72 . 5)
|      (1 . "Ligne 1\PLigne 2\PLigne 3")
|      (7 . "UBS-Style de texte")
|      (210 0.0 0.0 1.0)
|      (11 0.999544 0.0301896 0.0)
|      (42 . 7.23606)
|      (43 . 6.99866)
|      (50 . 0.0)
|      (73 . 1)
|      (44 . 1.0)
|
End of exploration...

 

Après le plus gros risque des MTEXT par rapport aux TEXT simple, c'est la mise en forme spécifique au sein du MTEXT. Par exemple si le texte est d'une couleur forcée, d'une police forcée, en gras, italique, etc on commence de suite à rentrer dans les tréfond de l'AutoLISP pour faire le tri xD

Voici un exemple avec la première ligne forcée en couleur rouge, la seconde ligne en gras et la troisième ligne avec une taille de police plus grande :

Explore DXF in progress from "MTEXT" (<Nom d'entité: 2ca3af5bdc0>) :
|      (-1 . <Nom d'entité: 2ca3af5bdc0>)
|      (0 . "MTEXT")
|      (330 . <Nom d'entité: 2c9e0dcd9f0>)
|      (5 . "4BBBA4")
|      (100 . "AcDbEntity")
|      (67 . 0)
|      (410 . "Model")
|      (8 . "0")
|      (48 . 0.5)
|      (100 . "AcDbMText")
|      (10 1.9019e+06 3.16255e+06 0.0)
|      (40 . 1.5)
|      (41 . 23.518)
|      (46 . 0.0)
|      (71 . 1)
|      (72 . 5)
|      (1 . "{\\C1;Ligne 1}\\P{\\fVerdana|b1|i0|c0|p34;Ligne 2}\\P{\\H1.33333x;Ligne 3}")
|      (7 . "UBS-Style de texte")
|      (210 0.0 0.0 1.0)
|      (11 0.999544 0.0301896 0.0)
|      (42 . 9.61986)
|      (43 . 7.68737)
|      (50 . 0.0)
|      (73 . 1)
|      (44 . 1.0)
|
End of exploration...

 

Donc si votre utilisation du MTEXT est simple (uniquement des retours à ligne avec la première ligne correspondant au nom de la pièce), je peux mettre un arrêt sur le "\P" au besoin.

 

Bisous,

Luna

Lien vers le commentaire
Partager sur d’autres sites

Hello

 

Les MTEXTs sont difficiles a gerer !?

 

Pour ce que tu demandes, il faut que RIEN ne soit FORCE (Couleur, Hauteur, Police, etc)

sur la 1ere ligne du MTEXT

pour que l on puisse recuperer la 1ere ligne et la mettre dans un TEXT "simple" ou ailleurs !

 

Le saut / changement de ligne est declenche par la balise : \P

Donc il faut prendre TOUT jusqu'au \P

 

Super Routine de Luna - Merci Luna !

 

La Sante, Bye, lecrabe "fatigue"

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

J'ai ajouté la découpe au premier "\P", je n'ai pas testé mais cela devrait fonctionner. Si le texte n'a pas de retour à la ligne, il prendra tout, sinon il ne prendra que la première ligne.

 

 

Ah super merci ! Par contre j'ai l'erreur :

 

Commande: SURFAREA ; erreur: type d'argument incorrect: listp "(aménagement figuratif)"

 

Après avoir sélectionner les objets.

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é