Aller au contenu

Hachurer par sélection ou par point


Messages recommandés

Posté(e)

Salut à tous,

 

Je me met enfin un peu plus sérieusement au lisp... Enfin j'essaie, car par maque de temps et de compétences de base en programmation, je dois bien dire que je nage... péniblement.

 

Je me suis procuré l'excellent livre "Programmer avec AutoCAD" mais même là, j'ai de la difficulté a m'y retrouver.

 

Finalement, cela fait quelques jours que je navigue dans diverses pages de CADxp et que je teste certaines solutions, sans pour autant comprendre la totalité des explications de fonctionnement.

 

Je vais donc suivre les conseils de certains d'entre vous et vous demander ainsi de l'aide sur un thème que j'aimerai développer à savoir une routine de hachurage pour les conditions suivantes :

 

- L'utilisateur doit pouvoir choisir d'hachurer soit des polygones fermés ou des zones fermées

- Le motif de hachure, l'échelle et l'angle doivent être définis à l'avance

- Les hachures doivent être séparées

- Les hachures doivent être en arrière-plan

 

Voici ce que j'ai "Pondu"... (avec mes connaissances des macros et des scripts)

 

 (defun c:H_BRIQUE ()
(setq ss (ssget))
 (command "_-hatch" "_P" "ANSI31" "1" "0" "_A" "_A" "_Y" "_H" "_Y" "" "_D" "_B" "_S" ss "" "")
)

(defun c:H_BETON ()
(setq ss (ssget))
 (command "_-hatch" "_P" "ANSI37" "2" "0" "_A" "_A" "_Y" "_H" "_Y" "" "_D" "_B" "_S" ss "" "")
)

 

En modifiant (setq ss (ssget)) avec le code ci-dessous trouvé dans un autre fil de discussion, je n'ai plus de problème avec des polygones non fermés.

Si quelqu'un peut me donner des explications sur les -4 AND et OR, merci d'avance.

 

Avec ces lignes de code, je ne peux que sélectionner des objets alors que j'aimerai pouvoir choisir entre sélection d'objet ou point interne d'une zone fermée... Et là mes limites sont largement dépassées.

 

Merci d'avance à celles et ceux qui pourront me faire progresser. @plus

 

(setq
ss (ssget
'((-4 . "(-4 . "(0 . "POLYLINE")
(-4 . "(-4 . "&") (70 . 1)
(-4 . "<") (70 . 16)
(-4 . "AND>")
(-4 . "AND>")
(-4 . "(0 . "LWPOLYLINE")
(-4 . "(-4 . "&") (70 . 1)
(-4 . "AND>")
(-4 . "AND>")
(-4 . "(0 . "MLINE")
(-4 . "(-4 . "=") (71 . 3)
(-4 . "AND>")
(-4 . "AND>")
(-4 . "(0 . "CIRCLE")
(-4 . "AND>")
(-4 . "(0 . "3DFACE")
(-4 . "AND>")
(-4 . "(0 . "ELLIPSE")
(-4 . "(-4 . "=") (41 . 0)
(-4 . "=") (42 . 6.283185307179586)
(-4 . "AND>")
(-4 . "AND>")
(-4 . "(0 . "SPLINE")
(-4 . "(-4 . "&") (70 . 1)
(-4 . "AND>")
(-4 . "AND>")
(-4 . "(0 . "REGION")
(-4 . "AND>")
(-4 . "OR>"))
))

Jean-Philippe - Formateur / Dessinateur sur AutoCAD et MEP

http://www.git-cad.ch

Posté(e)

Salut jifi,

 

C'est un bon début, avec les hachures, tu ne t'attaques pas au plus facile.

 

Pour laisser à l'utilisateur le choix entre un point interne ou une sélection d'objet, tu peux utiliser la méthode suivante :

- si l'utilisateur clique un point, la condition (getpoint ...) est remplie la commande hachure par point interne est lancée.

- si la condition n'est pas remplie (l'utilisateur fait Entrée, Espace ou clic droit), l'utilisateur est invité à choisir des objets et si la sélection est valide, la commande Hachure par sélection est lancée.

 

(defun c:H_BRIQUE (/ pt ss)

 ;; Condition : l'utilisateur clique un point
 (if (setq pt (getpoint "\nSpécifiez le point interne ou [b]: "))

   ;; Si la condition est remplie
   (command "_-hatch" "_P" "ANSI31" "1" "0" "_A" "_A" "_Y" "_H" "_Y" "" "_D" "_B" pt "")

   ;; Sinon (Entrée, Espace ou clic droit)
   (if	(setq ss (ssget))

     ;; Si un ou des objets sont sélectionnés
     (command "_-hatch" "_P" "ANSI31" "1" "0" "_A" "_A" "_Y" "_H" "_Y" "" "_D" "_B" "_S" ss "" "")
   )
 )
 (princ)
) 

 

En ce qui concerne les AND et OR, il s'agit d'opérateur logiques dans un filtre de sélection.

Il fonctionnent toujours par deux : un ouvrant (-4 . "") et concernent toutes les expressions qu'ils enferment. Ils peuvent être imbriqués.

Petite explication avec la liste que tu donnes et que j'ai simplifiée (certains opérateurs étant inutiles)

 

(setq
 ss (ssget
      '((-4 . "[b]	 (-4 . "[b]	 (0 . "POLYLINE")
 (-4 . "&") (70 . 1)
 (-4 . "[b]	 (-4 . "AND>")
 (-4 . "[b]	 (0 . "LWPOLYLINE")
 (-4 . "&") (70 . 1)
 (-4 . "AND>")
 (-4 . "[b]	 (0 . "MLINE")
 (71 . 3)
 (-4 . "AND>")
 (0 . "CIRCLE")
 (0 . "3DFACE")
 (-4 . "[b]	 (0 . "ELLIPSE")
 (41 . 0)
 (42 . 6.283185307179586)
 (-4 . "AND>")
 (-4 . "[b]	 (0 . "SPLINE")
 (-4 . "[b]	 (-4 . "&") (70 . 1)
 (-4 . "AND>")
 (0 . "REGION")
 (-4 . "OR>")
)
    )
) 

 

La liste commence par un (-4 . "") correspondant donc tous les filtres ou groupes de filtre compris entre les deux seront valides : polyligne ou lwpolyligne ou mline ou circle etc ...

mais pas n'importe quelle polyligne :

(-4 . "

(0 . "POLYLINE")

(-4 . "&") (70 . 1)

(-4 . "

(-4 . "AND>")

elle doit être fermée (70 . 1) et ne pas être un maillage code 70 inférieur à 16 (j'aurais plutôt mis inférieur à 8 pour écarter les polylignes 3d)

 

De même une lwpolyline doit être fermée (-4 . "&") (70 . 1), une mline fermée et posséder au moins un sommet, une ellipse ou une spline fermée.

 

PS : pour éviter que CADxp ne prenne les "

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

Posté(e)

Bonjour jifi

 

Au cas ou tu ne l'aurais pas déjà consulté, un sujet similaire qui réalisait ce que tu demandes.

 

Inspires toi en, c'est là pour ça!

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Salut (gile)

 

Merci pour ces infos, je commence à y voir plus clair notamment au niveau des filtres.

 

Ceci dit, je pense que j'ai fait une erreur en collant la liste modifiée pour ssget (voir ci-dessous) ou alors il y a un problème avec les parenthèses, car lorsque j'appuie sur ENTER, la fonction plante.

Pour info, la liste précédente fonctionne.

 

Autres demandes :

Comment faire pour inactiver le bouton ACCROBJ au début et le réactiver à la fin ?

J'ai bien trouvé des infos dans l'aide AutoCAD avec la variable OSMODE, mais je n'ai pas compris comment ça fonctionne.

Est-il possible, lors du choix d'un point que la commande ne se termine pas et que l'utilisateur puisse continuer à cliquer d'autres points interne et qu'il termine la commande avec ESC ?

 

Merci d'avance pour ton aide.

 

PS en cas de problème avec le code, je peux t'envoyer le fichier par mail.

 

Salut bonuscad

 

Merci pour ton info :

 

Au cas ou tu ne l'aurais pas déjà consulté, un sujet similaire qui réalisait ce que tu demandes.

Inspires toi en, c'est là pour ça!

C'est ce que j'ai fait, mais étant donné mon niveau, ton lisp fonctionne super, mais déjà trop compliqué pour que je le comprenne d'où ce sujet.

Merci d'avance pour toute explication qui me fera progresser.

 

(defun c:H_BRIQUE (/ pt ss)
  
  (if (setq pt (getpoint "\nSpécifiez le point interne ou [b]<[/b]ENTER pour Sélection>: "))
  (command "_-hatch" "_P" "ANSI31" "1" "0" "_A" "_A" "_Y" "_H" "_Y" "" "_D" "_B" pt "")
  (if (setq
ss (ssget
'((-4 . "[b]<[/b]OR")
(-4 . "[b]<[/b]AND")
(0 . "POLYLINE")
(-4 . "&") (70 . 1)
(-4 . "[b]<[/b]") (70 . 16)
(-4 . "AND>")
(-4 . "[b]<[/b]AND")
(0 . "LWPOLYLINE")
(-4 . "&") (70 . 1)
(-4 . "AND>")
(-4 . "[b]<[/b]AND")
(0 . "MLINE")
(71 . 3)
(-4 . "AND>")
(0 . "CIRCLE")
(0 . "3DFACE")
(-4 . "[b]<[/b]AND")
(0 . "ELLIPSE")
(41 . 0)
(42 . 6.283185307179586)
(-4 . "AND>")
(-4 . "[b]<[/b]AND")
(0 . "SPLINE")
(-4 . "[b]<[/b]AND")
(-4 . "&") (70 . 1)
(-4 . "AND>")
(0 . "REGION")
(-4 . "OR>")
)
)
)
  (command "_-hatch" "_P" "ANSI31" "1" "0" "_A" "_A" "_Y" "_H" "_Y" "" "_D" "_B" "_S" ss "" "")
  )
  )
(princ)
)

Jean-Philippe - Formateur / Dessinateur sur AutoCAD et MEP

http://www.git-cad.ch

Posté(e)

Salut,

 

L'erreur vient de moi j'ai oublié de supprimer un (-4 . "

 

Comme je disais, les opérateurs logiques doivent être appariés (comme les parenthèses)

 

Voici la liste corrigée et commentée (j'ai rajouté le code binaire 8 pour les spline (plane)

(setq ss (ssget
   '((-4 . "[b]	     
     ;; POLYLINE 2d ou 3d fermée
     (-4 . "[b]	     (0 . "POLYLINE")
     (-4 . "&") (70 . 1)
     (-4 . "	     (-4 . "AND>")
     
     ;; LWPOLYLINE fermée
     (-4 . "[b]	     (0 . "LWPOLYLINE")
     (-4 . "&") (70 . 1)
     (-4 . "AND>")
     
     ;; MLINEfermée avec au moins un sommet
     (-4 . "[b]	     (0 . "MLINE") 
            (71 . 3)
     (-4 . "AND>")
     
     ;; CIRCLE
     (0 . "CIRCLE")
     
     ;; 3DFACE
     (0 . "3DFACE")
     
     ;; ELLIPSE fermée
     (-4 . "[b]	     (0 . "ELLIPSE")
     (41 . 0)
     (42 . 6.283185307179586)
     (-4 . "AND>")
     
     ;; SPLINE fermée et plane
     (-4 . "[b]	     (0 . "SPLINE")
     (-4 . "&") (70 . 9)
     (-4 . "AND>")
     
     ;; REGION
     (0 . "REGION")
     
     (-4 . "OR>")
    )
 )
) 

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

Posté(e)

Salut (gile)

 

L'erreur vient de moi j'ai oublié de supprimer un (-4 . "

 

Merci pour cette info, j'aurai dû le voir. Tes précisions sont très utiles pour ma compréhension.

 

J'ai trouvé comment faire pour inactiver le bouton ACCROBJ au début et le réactiver à la fin avec la variable AutoCAD Osmode.

 

Je cherche encore que la commande ne se termine pas lors du choix d'un point et que l'utilisateur puisse continuer à cliquer d'autres points interne et qu'il termine la commande avec ESC.

 

@plus

 

(defun c:H_BRIQUE (/ s_osm pt ss)
(setq s_osm (getvar "OSMODE"))
(setvar "OSMODE" 0)
(if (setq pt (getpoint "\nSpécifiez le point interne ou [b]<[/b]ENTER pour Sélection>: "))
(command "_-hatch" "_P" "ANSI31" "1" "0" "_A" "_A" "_Y" "_H" "_Y" "" "_D" "_B" pt "")
(if (setq
ss (ssget
'((-4 . "[b]<[/b]OR")
(-4 . "[b]<[/b]AND")
(0 . "POLYLINE")
(-4 . "&") (70 . 1)
(-4 . "[b]<[/b]") (70 . 16)
(-4 . "AND>")
(-4 . "[b]<[/b]AND")
(0 . "LWPOLYLINE")
(-4 . "&") (70 . 1)
(-4 . "AND>")
(-4 . "[b]<[/b]AND")
(0 . "MLINE")
(71 . 3)
(-4 . "AND>")
(0 . "CIRCLE")
(0 . "3DFACE")
(-4 . "[b]<[/b]AND")
(0 . "ELLIPSE")
(41 . 0)
(42 . 6.283185307179586)
(-4 . "AND>")
(-4 . "[b]<[/b]AND")
(0 . "SPLINE")
(-4 . "&") (70 . 1)
(-4 . "AND>")
(0 . "REGION")
(-4 . "OR>")
)
)
)
(command "_-hatch" "_P" "ANSI31" "1" "0" "_A" "_A" "_Y" "_H" "_Y" "" "_D" "_B" "_S" ss "" "")
)
)
(setvar "OSMODE" s_osm)
(princ)
)

Jean-Philippe - Formateur / Dessinateur sur AutoCAD et MEP

http://www.git-cad.ch

Posté(e)

hello

 

si ca peut t'aider

faut peut etre faire un peut de menage

la liste des hachures par exemples ou pour tout voir faut tapper sur "F2"

 

ca bug un peut des fois ok ok j'avoue

 

oupsss pas sur que mon LISP créer les hachures en arriere plans par contre

 

 

phil

 

 

 

 ;;;				 ---------------------------------------------
;;;				 REMPLIT PAR UN HACHURAGE LES POLYLIGNES FERMEE
;;;				 ---------------------------------------------


(defun C:HAC2 (/)
  (setvar "cmdecho" 1)
  (setvar "dimzin" 0)
  (setq CAV (getvar "clayer"))
  (setq OSM (getvar "osmode"))
  (setvar "osmode" 0)
  (setq TYPEHACH (getcfg "APPDATA/TYPEHACH"))
  (setq ECHELHACH (atof (getcfg "APPDATA/ECHELHACH")))
  (setq ANGLHACH (atof (getcfg "APPDATA/ANGLHACH")))
  (setq CALQUEHACH2 (getcfg "APPDATA/Tcalq2"))
  (setq CALQUEHACH NIL)
  (princ "\n")
  (princ "\n")
  (setq S1 (getstring t "\nVOULEZ VOUS SELECTIONNER LE TYPE DE HACHURAGE SI OUI TAPPER S "))
  (if (or (= S1 "S") (= S1 "s"))
     (progn (setq H2 NIL)
     (setq HACH1 NIL)
     (setq TEST1 0)
;;;		(setq ENT1 nil)
;;;	       		(while (null ENT1)
;;;		    (setq ENT1 (ssget (list (cons -4 ";;;				       (cons 0 "HATCH")
;;;				       (cons -4 "or>")
;;;					 )
;;;				  )
;;;		    )
;;;	       )
     (while (/= TEST1 1)
	(setq ENT1 (car (nentsel "\nSELECTIONNER LA HACHURE DE BASE.")))
	(setq TEST  (cdr (assoc 0 (entget ENT1)))
	      TEST1 (cond ((= TEST "HATCH") 1))
	)
     )
     (setq TYPEHACH   (cdr (assoc 2 (entget ENT1)))
	   CALQUEHACH (cdr (assoc 8 (entget ENT1)))
     )
     (if (or (= TYPEHACH "SOLID") (= TYPEHACH "solid"))
	(setq ECHELHACH	1
	      ANGLHACH 0
	)
	(setq ECHELHACH	(cdr (assoc 41 (entget ENT1)))
	      ANGLHACH	(* (cdr (assoc 52 (entget ENT1))) (/ 180 pi))
	)
     )
     )
     (progn (prompt "\nSOLID           -  remplissage de solide")
     (prompt "\nANGLE           -  angle acier")
     (prompt "\nANSI31          -  fer, brique, maçonnerie en pierres")
     (prompt "\nANSI32          -  acier")
     (prompt "\nANSI33          -  bronze, laiton, cuivre")
     (prompt "\nANSI34          -  plastique, élastique")
     (prompt "\nANSI35          -  brique réfractaire, matériau réfractaire")
     (prompt "\nANSI36          -  marble, ardoise, verre")
     (prompt "\nANSI37          -  plomb, zinc, magnesium, isolation acoustique/thermique/électrique")
     (prompt "\nANSI38          -  aluminium")
     (prompt "\nAR-B816         -  support d'élévation de bloc 8x16")
     (prompt "\nAR-B816C        -  support d'élévation de bloc avec des joints de mortier 8x16")
     (prompt "\nAR-B88          -  support d'élévation de bloc 8x8")
     (prompt "\nAR-BRELM        -  support standard en brique pour l'élévation de bloc à l'anglaise avec"	     )
     (prompt "\nAR-BRSTD        -  support standard en brique pour l'élévation de bloc")
     (prompt "\nAR-CONC         -  point au hasard et motif en pierres")
     (prompt "\nAR-HBONE        -  motif de brique standard en arête de poisson à 45 degrés")
     (prompt "\nAR-PARQ1        -  revêtement de sol de 2x12 : motif de 12x12")
     (prompt "\nAR-RROOF        -  toiture en galet")
     (prompt "\nAR-RSHKE        -  toiture en bois")
     (prompt "\nAR-SAND         -  motif de points disposés au hasard")
     (prompt "\nBOX             -  boîte en acier")
     (prompt "\nBRASS           -  matériau en laiton")
     (prompt "\nBRICK           -  surface en brique ou en maçonnerie")
     (prompt "\nBRSTONE         -  briques et pierres")
     (prompt "\nCLAY            -  argile")
     (prompt "\nCORK            -  liège")
     (prompt "\nCROSS           -  une série de croix")
     (prompt "\nDASH            -  tirets")
     (prompt "\nDOLMIT          -  marcottage géologique de roches")
     (prompt "\nDOTS            -  une série de points")
     (prompt "\nEARTH           -  terre ou terrain - sous terre - ")
     (prompt "\nESCHER          -  motif Escher")
     (prompt "\nFLEX            -  matériau flexible")
     (prompt "\nGRASS           -  aire gazonnée")
     (prompt "\nGRATE           -  grille")
     (prompt "\nGRAVEL          -  Motif gravier")
     (prompt "\nHEX             -  héxagones")
     (prompt "\nHONEY           -  motif alvéolaire")
     (prompt "\nHOUND           -  pied de poule")
     (prompt "\nINSUL           -  matériau isolant")
     (prompt "\nACAD_ISO02W100  -  tiret")
     (prompt "\nACAD_ISO03W100  -  tiret espace")
     (prompt "\nACAD_ISO04W100  -  tiret long points")
     (prompt "\nACAD_ISO05W100  -  tiret long deux points")
     (prompt "\nACAD_ISO06W100  -  tiret long trois points")
     (prompt "\nACAD_ISO07W100  -  point")
     (prompt "\nACAD_ISO08W100  -  tiret long point court")
     (prompt "\nACAD_ISO09W100  -  tiret long deux tirets courts")
     (prompt "\nACAD_ISO10W100  -  tiret points")
     (prompt "\nACAD_ISO11W100  -  deux tirets  point")
     (prompt "\nACAD_ISO12W100  -  tiret deux points")
     (prompt "\nACAD_ISO13W100  -  deux tirets deux points")
     (prompt "\nACAD_ISO14W100  -  tiret trois points")
     (prompt "\nACAD_ISO15W100  -  deux tirets trois points")
     (prompt "\nLINE            -  lignes horizontales parallèles")
     (prompt "\nMUDST           -  boue et sable")
     (prompt "\nNET             -  grille horizontale / verticale")
     (prompt "\nNET3            -  motif réseau 0-60-120")
     (prompt "\nPLAST           -  matériau plastique")
     (prompt "\nPLASTI          -  matériau plastique")
     (prompt "\nSACNCR          -  béton")
     (prompt "\nSQUARE          -  alignement de petits carrés")
     (prompt "\nSTARS           -  étoile de David")
     (prompt "\nSTEEL           -  matériau métallique")
     (prompt "\nSWAMP           -  zone marécageuse")
     (prompt "\nTRANS           -  matériau thermoconducteur")
     (prompt "\nTRIANG          -  triangles équilatéraux")
     (prompt "\nZIGZAG          -  effet d'escalier")
     (setq TYPE1 (getstring t (strcat "\nVEUILLEZ ENTRER LE NOUVEAU TYPE DE HACHURAGE <" TYPEHACH ">: ")))
     (if (/= TYPE1 "")
	(setq TYPEHACH TYPE1)
     )
     (if (/= TYPEHACH "solid")
	(progn (setq ECHL1 (getdist (strcat "\nENTRER LA VALEUR DE L'ECHELLE DE HACHURAGE  <" (rtos ECHELHACH 2 8) ">: ")))
	       (if ECHL1
		  (setq ECHELHACH ECHL1)
	       )
	       (setq ANGL1 (getdist (strcat "\nENTRER LA VALEUR DE L'ANGLE DE HACHURAGE  <" (rtos ANGLHACH 2 8) ">: ")))
	       (if ANGL1
		  (setq ANGLHACH ANGL1)
	       )
	)
     )
     )
  )
  (setq S2 (getstring t "\nVOULEZ VOUS SELECTIONNER DES POLYLIGNES OU DES POINTS SI OUI TAPPER P "))
  (if (or (= S2 "P") (= S2 "p"))
     (progn (prompt "CLIQUER LES POINT A HACHURER:")
;;; (if (= calquehach nil)
     (command "-calque" "ch" CALQUEHACH "")
;;;	(command "-calque" "ch" calquehach "")
;;;	)
;;;    (princ "\)
;;;    (princ "\)
     (command "-fhach" "p" TYPEHACH ECHELHACH ANGLHACH "A" "A" "O" "")
;;;      (initget "O N")
;;;      (setq ANS (getkword "EST CE QUE LE HACHURAGE VOUS CONVIENT ? (O/N):"))
;;;      (if (= ANS "N")
;;;	(command "ANNULER" "")
;;;      )
;;;  (setvar "clayer" cav)
;;;      (command "-fhach")
     )
     (progn (command "-fhach" "p" TYPEHACH ECHELHACH ANGLHACH "A" "A" "O" "" "")
     (if (= CALQUEHACH NIL)
	(command "-calque" "ch" CALQUEHACH2 "")
	(command "-calque" "ch" CALQUEHACH "")
     )
     (prompt "CLIQUER SUR L'ENTITE(S) POLYLIGNE(S) A HACHURER :")
     (setq LESPOLY NIL)
     (while (null LESPOLY)
	(setq LESPOLY (ssget (list (cons -4 "					   (cons 0 "CIRCLE")
				   (cons 0 "polyline")
				   (cons 0 "lwpolyline")
				   (cons 0 "AEC_POLYGON")
				   (cons -4 "or>")
			     )
		      )
	)
     )
     (setq FERM NIL)
     (setq COMPT 0)
     (setq COM (sslength LESPOLY))
     (while (< COMPT COM)
	(progn (setq UNEPOLY (ssname LESPOLY COMPT))
	       (setq FORME (cdr (assoc 0 (entget UNEPOLY))))
	       (setq FERM (cdr (assoc 70 (entget UNEPOLY))))
	       (setq NBPOINT (cdr (assoc 90 (entget UNEPOLY))))
	       (if (= FORME "CIRCLE")
		  (setq	FERM 1
			NBPOINT	3
		  )
	       )
	       (if (and (or (= FERM 129) (= FERM 1)) (> NBPOINT 2))
		  (command "-fhach" "SE" UNEPOLY "" "")
	       )
	       (setq COMPT (1+ COMPT))
	)
     )
     (princ)
     (setq COMPT 0)
     (initget "O N")
     (setq ANS (getkword "EST CE QUE LE HACHURAGE VOUS CONVIENT ? (O/N):"))
     (if (= ANS "N")
	(progn (while (< COMPT COM) (command "ANNULER" "") (setq COMPT (1+ COMPT))))
     )
     (setvar "clayer" CAV)
     )
  )
  (setcfg "APPDATA/typehach" TYPEHACH)
  (setcfg "APPDATA/echelhach" (rtos ECHELHACH 2 8))
  (setcfg "APPDATA/anglhach" (rtos ANGLHACH 2 8))
  (setvar "osmode" OSM)
;;;  (setvar "clayer" cav)
  (princ)
)

 

[Edité le 3/7/2008 par PHILPHIL]

FREELANCE

Autodesk Architecture 2025 sous windows 11 64

REVIT

24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal

  • 2 semaines après...
Posté(e)

Salut,

 

Voici ma fonction de hachurage presque au point, j'ai encore un problème avec la réactivation du bouton ACCROBJ si l'utilisateur termine la fonction avec la touche [ESC]

 

Merci d'avance à ceux qui pourront résoudre cette énigme.

 

@plus

 

(defun c:H_BRIQUE (/ s_osm pt ss)
(setq s_osm (getvar "OSMODE"))
(if ([b]<[/b] s_osm 16385)(setvar "OSMODE" (+ s_osm 16384)))
(if (setq pt (getpoint "\nSpécifiez le point interne ou [b]<[/b]ENTER pour Sélection>: "))
(command "_-hatch" "_P" "ANSI31" "1" "0" "_A" "_A" "_Y" "_H" "_Y" "" "_D" "_B" pt "")
(if (setq
ss (ssget
'((-4 . "[b]<[/b]OR")
(-4 . "[b]<[/b]AND")
(0 . "POLYLINE")
(-4 . "&") (70 . 1)
(-4 . "[b]<[/b]") (70 . 16)
(-4 . "AND>")
(-4 . "[b]<[/b]AND")
(0 . "LWPOLYLINE")
(-4 . "&") (70 . 1)
(-4 . "AND>")
(-4 . "[b]<[/b]AND")
(0 . "MLINE")
(71 . 3)
(-4 . "AND>")
(0 . "CIRCLE")
(0 . "3DFACE")
(-4 . "[b]<[/b]AND")
(0 . "ELLIPSE")
(41 . 0)
(42 . 6.283185307179586)
(-4 . "AND>")
(-4 . "[b]<[/b]AND")
(0 . "SPLINE")
(-4 . "&") (70 . 1)
(-4 . "AND>")
(0 . "REGION")
(-4 . "OR>")
)
)
)
(command "_-hatch" "_P" "ANSI31" "1" "0" "_A" "_A" "_Y" "_H" "_Y" "" "_D" "_B" "_S" ss "" "")
)
)
(setvar "OSMODE" s_osm)
(princ)
)

Jean-Philippe - Formateur / Dessinateur sur AutoCAD et MEP

http://www.git-cad.ch

Posté(e)

Salut,

 

j'ai encore un problème avec la réactivation du bouton ACCROBJ si l'utilisateur termine la fonction avec la touche [ESC]

 

Un "classique"...

 

Un "Echap" pendant le déroulement d'un LISP est considéré par AutoCAD comme une "erreur AutoLISP".

La fonction AutoLISP *error* permet de redéfinir la gestion des erreurs pendant le déroulement d'un LISP.

Voir dans l'aide aux développeurs :

- AutoLISP Reference > AutoLISP Functions > E Functions > *error*

- AutoLISP Developer's Guide > Using the AutoLISP Language > AutoLISP Basics > Error Handling in AutoLISP.

 

En gros, on peut utiliser 2 méthodes avec *error* :

 

La première consiste à définir un fonction de gestion des erreurs à part de la routine principale, et, dans la routine principale de sauvegarder la définition de *error* et de la remplacer par sa propre routine, puis de restaurer la valeur initiale en fin de routine.

On notera que la restauration de l'environnement initial (variable(s) et *error*) est semblable dans les deux routines.

Exemple

 

;;; Routine de gestion des erreurs
(defun MonErreur	(msg)
 (if (or
(= msg "Fonction annulée")
(= msg "quitter / sortir abandon")
     )
   (princ)
   (princ (strcat "\nErreur: " msg))
 )
 (command)
 (setvar "OSMODE" s_osm)
 (setq *error* m:err
   m:err nil
   )
 (princ)
)

;;; Routine principale
(defun c:H_BRIQUE (/ s_osm pt ss)

 ;; Sauvegarde et redéfinition de *error*
 (setq	m:err	*error*
*error*	MonErreur
 )

 ;; Sauvegarde et modification de variables système
 (setq s_osm (getvar "OSMODE"))
 (if (    (setvar "OSMODE" (+ s_osm 16384))
 )

 ;; ici, le corps de la routine

 ;; restauration de l'environnement
 (setvar "OSMODE" s_osm)
 (setq	*error*	m:err
m:err nil
 )
 (princ)
) 

 

La seconde, que j'utilise désormais plus volontiers, consiste à redéfinir *error* à l'intérieur de la fonction principale. Dans ce cas, il est primordial de déclarer *error* comme variable locale pour que cette redéfinition ne soit valable qu'au sein de la routine principale.

Exemple

 

;;; Routine principale
(defun c:H_BRIQUE (/ *error* s_osm pt ss)

;;; Routine de gestion des erreurs
 (defun *error* (msg)
   (if	(or
  (= msg "Fonction annulée")
  (= msg "quitter / sortir abandon")
)
     (princ)
     (princ (strcat "\nErreur: " msg))
   )
   (command)
   (setvar "OSMODE" s_osm)
   (setq *error* m:err
  m:err	nil
   )
   (princ)
 )

 ;; Sauvegarde et modification de variables système
 (setq s_osm (getvar "OSMODE"))
 (if (    (setvar "OSMODE" (+ s_osm 16384))
 )

 ;; ici, le corps de la routine

 ;; restauration de l'environnement
 (setvar "OSMODE" s_osm)
 (princ)
) 

 

Pour une gestion plus générale des variables système, de nombreuses solutions sont proposées, quelques exemples ici, ou , ou encore .

On peut aussi utiliser la routine ai_sysvar définie dans AutoCAD.mnl jusqu'à la version2006 puis dans acad200Xdoc.lsp, donc chargée à chaque ouverture d'un nouveau dessin.

Pour modifier/sauvegarder une variable :

(ai_sysvar '("osmode" . 0))

ou plusieurs variables :

(ai_sysvar '(("osmode" . 0) ("cmdecho" . 0)))

et pour restaurer les valeurs initiales, tout simplement :

(ai_sysvar nil)

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

  • 3 semaines après...

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é