Aller au contenu

Titifonky

Membres
  • Compteur de contenus

    125
  • Inscription

  • Dernière visite

Tout ce qui a été posté par Titifonky

  1. :D je ne suis pas frustré(e):), je trouve meme ça rigolo. Si j'avais reçu une reponse directe, je n'aurais pas chercher plus loin. Maintenant j'ai decouvert un peu plus le VBA et je trouve ca pas mal. Je me pose même la question de l'interet du Lisp si ce n'est la meilleur imbrication du Lisp dans Autocad par rapport au VBA. Les interfaces DCL ne sont pas très pratique. J'ai déjà fais un peu de programmation en Common LISP et je trouve qu'il manque le module de programmation orienté objet LISP "CLOS pour les intimes" dans autocad. Cela permettrait d'avoir un outils très puissant, et surement mieux que le VBA C'est dommage mais ce n'est qu'un avis personnel bien sur !!! Bonne soirée [Edité le 16/6/2005 par Titifonky]
  2. Voici une fonction de tri par ordre alphabétique d'un tableau à une dimension contenant des chaines de caractères (pour trier des calques par exemple;)) Public Function Tri(Tabl As Variant) Dim Temp As String Dim i As Integer Dim flag As Boolean flag = True i = 0 Do While flag flag = False For i = 0 To UBound(Tabl) - 1 If StrConv(Tabl(i), 2) > StrConv(Tabl(i + 1), 2) Then Temp = Tabl(i + 1) Tabl(i + 1) = Tabl(i) Tabl(i) = Temp flag = True End If Next i Loop Tri = Tabl End Function et une fonction qui renvoie un tableau à une dimension contenant les calques trié par ordre alphabétique ;) repondant aux critère "Nom". La routine cherche si la chaine "Nom" est contenue dans le nom des calques. Public Function FindLayer(Nom As String) As Variant Dim AllLayers As Object Dim Layer As Object Dim Pointeur As Integer Dim TabLayer() As String ReDim TabLayer(1) Pointeur = 1 Set AllLayers = ThisDrawing.Layers For Each Layer In AllLayers If InStr(1, Layer.Name, Nom, 1) Then ReDim Preserve TabLayer(Pointeur) TabLayer(Pointeur) = Layer.Name Pointeur = Pointeur + 1 End If Next If Pointeur = 1 Then TabLayer(Pointeur) = "0" End If FindLayer = Tri(TabLayer) End Function Bonne programmation
  3. Salut la compagnie, Je pense que je vais continuer à discuter tout seul mais bon j'ai trouvé les raisons de mon problème et quelques solutions. Le problème avec l'evenement ObjectAdded c'est qu'il renvoie toutes les entitées crées au cours de la commande et non l'entitée général crée à la fin. Je m'explique : Quand autocad crée une ligne de cote, il crée d'abord les lignes, les fleches, les textes et [surligneur]les points[/surligneur] , etc... puis il en fait un bloc et doit surement le transformer en objet AutoCAD ??. Le problème arrive au moment de la création des points, ces points sont crée sur le calque Defpoint, à ce moment là si la propriété du calque est changé il va essayé de changer la propriété calque des points crées sur Defpoint. La cotation va être crée mais si on essaye d'effacer la ligne de cote il envoie une "Erreur Fatale". Conclusion, pour recuperer une entité complexe crée au cours d'une commande il vaut mieux utiliser " AutoCAD.Application.ActiveDocument.ModelSpace.Item(Count - 1)" , l'equivalent de entlast en Lisp. En esperant que ces informations vous aide.
  4. Bonjour à tous, Je me suis lancé depuis peu dans le VBA et je rencontre mes premiers problèmes. J'ai écrit quelques lignes de code pour mettre certains types d'objet directement dans un calque au moment de leurs création. La routine fonctionne très bien pour les entitées simples tel que le rectangle, les fenêtres, mais quand j'essaye la propriété Layer sur des objets de cotation il m'annonce de manière aléatoire une erreur fatale. Public Obj As Object ---------------------------------------------------------------- Public Sub AcadDocument_EndCommand(ByVal CommandName As String) If CommandName <> "ERASE" And Not Obj Is Nothing Then Select Case Obj.ObjectName Case "AcDbPolyline" If ThisDrawing.ActiveLayout.Name <> "Model" And CommandName = "RECTANGLE" Then Obj.Layer = FindLayer("cadre") End If Case "AcDbViewport" Obj.Layer = FindLayer("fmult") Case "AcDbAlignedDimension", "AcDbRotatedDimension", "AcDbOrdinateDimension", "AcDbRadialDimension", "AcDbDiametricDimension", "AcDb2LineAngularDimension", "AcDbLeader", "AcDbMText" Obj.Layer = FindLayer("cotation") End Select End If Set Obj = Nothing End Sub ---------------------------------------------------------------- Private Sub AcadDocument_ObjectAdded(ByVal object As Object) Set Obj = object End Sub ---------------------------------------------------------------- Private Function FindLayer(nom As String) As String Dim AllLayers As Object Dim Layer As Object Set AllLayers = ThisDrawing.Layers For Each Layer In AllLayers If InStr(1, Layer.Name, nom, 1) Then FindLayer = Layer.Name Exit Function End If Next FindLayer = "0" End Function Es ce que quelqu'un à une idée sur ce genre de problèmes ?? Merci
  5. Bonjour Serge, Pour repondre à ta question, ce programme me sert à creer des profils métallique à partir de formes rapide à dessiner tel que les cercles et les rectangles. Ces formes sont assemblées et transformées en polyligne à l'aide de ce programme. Après quelques modification, j'ai repris la base de mon programme que tu m'as corrigé et je l'ai terminé. J'ai rajouté un filtre pour les splines (defun c:pf () (setq cmde (getvar "CMDECHO") hp (getvar "HPBOUND") snap (getvar "AUTOSNAP") ) ;_ Fin de setq (setvar "CMDECHO" 0) (setvar "HPBOUND" 0) (setvar "AUTOSNAP" 2) (setq list_ent 'nil) ;; création des régions (setq repere (entlast)) (initget 1) (while (setq point (getpoint "\nMontrez le point interne des régions à assembler : " ) ;_ Fin de getpoint ) ;_ Fin de setq (command "_.-boundary" point "") (setq derent (list (entlast))) (setq list_ent (append derent list_ent)) (mapcar '(lambda (x) (vlax-invoke-method (vlax-ename->vla-object x) 'highlight 1) ) ;_ Fin de lambda list_ent ) ;_ Fin de mapcar ) ;_ Fin de while ;; mise en surbrillance des régions (foreach x list_ent (redraw x 1)) ;; annulations de la mise en surbrillance des régions (mapcar '(lambda (x) (vlax-invoke-method (vlax-ename->vla-object x) 'highlight 0) ) ;_ Fin de lambda list_ent ) ;_ Fin de mapcar ;; union des régions (setq ss (ssadd)) (foreach x list_ent (ssadd x ss)) (if (and ss (> (sslength ss) 1)) (command "._union" ss "") ) ;_ Fin de if (if (/= repere (entlast)) (progn (setq ss (ssadd)) (setq repere (entlast)) (command "._explode" (entlast) "") (setq x (entnext repere)) (while x (if (not (equal (cdr (assoc 0 (entget x))) "SPLINE")) (setq ss (ssadd x ss)) ) ;_ Fin de if (setq x (entnext x)) ) ;_ Fin de while ) ;_ Fin de progn ) ;_ Fin de if (command "_pedit" "_multiple" ss "" "_yes" "_join" "" "") (setq poly (entlast)) (command "._move" poly "" pause pause) (setvar "CMDECHO" cmde) (setvar "HPBOUND" hp) (setvar "AUTOSNAP" snap) (princ) ) ;_ Fin de defun Merci beaucoup pour ton aide Titifonky [Edité le 7/6/2005 par Titifonky]
  6. Bonjour à tous, Je suis en train de faire un petit programme (ça faisait longtemps) pour transformer des régions en polyligne. J'ai chercher sur le forum mais je n'ais rien trouver de très intéressant pour m'aider. Ma demarche est la suivante : (dans le même programme Lisp) 1 - Je crée des régions en utilisant la commande "Boundary" 2 - J'assemble les régions avec la commande "Union" 3 - J'explose la région obtenu. 4 - Je crée une polyligne à partir des objets récupéré de l'explosion Mon problème se trouve entre l'étape 2 et l'étape 3. Quand la région est crée à partir de la commande "Union", je n'arrive pas à récupérer le numéro de l'entité crée. (defun c:pf () (setq cmde (getvar "CMDECHO") hp (getvar "HPBOUND") snap (getvar "AUTOSNAP") ) ;_ Fin de setq (setvar "CMDECHO" 0) (setvar "HPBOUND" 0) (setvar "AUTOSNAP" 2) (setq list_ent 'nil) ;; création des régions (while (setq point (getpoint)) (command "_.-boundary" point "") (setq derent (list (entlast))) (setq list_ent (append derent list_ent)) ;; mise en surbrillance des régions (mapcar '(lambda (x) (vlax-invoke-method (vlax-ename->vla-object x) 'highlight 1) ) ;_ Fin de lambda list_ent ) ;_ Fin de mapcar ) ;_ Fin de while ;; annulations de la mise en surbrillance des régions (mapcar '(lambda (x) (vlax-invoke-method (vlax-ename->vla-object x) 'highlight 0) ) ;_ Fin de lambda list_ent ) ;_ Fin de mapcar ;; recupération du numero de la dernière entitée crée (princ (entlast)) ;; union des régions (eval (append '(command "union") list_ent)) ;; recupération du numero de la dernière entitée crée (princ (entlast)) ;; le numéro de cette entité correspond au numéro récupéré avant la commande union !!!!!! (setvar "CMDECHO" cmde) (setvar "HPBOUND" hp) (setvar "AUTOSNAP" snap) (princ) ) ;_ Fin de defun Il faudrait peut-être mettre à jour la base de donnée des objets mais comment !!!! J'ai essayé de faire un "entupd" sur les régions que j'ai crée mais ça ne met pas à jour le fait que ces régions ont été unie. La solution pourrait être d'avoir deux programmes Lisp: -le premier programme permettrait d'unir les régions crées Entre les deux programmes, les objets serait mis à jour automatiquement par Autocad -le deuxième programme recupererait la région crée par union et la décomposerait pour créer la polyligne Cette solution ne m'interresse pas car elle demande de faire deux manipulation mais s'il n'y a pas d'autre solutions je me resignerais à utiliser celle-ci. J'ai essayé de passer par le VLisp pour l'union des régions mais je n'ais pas tout compris vue le peu d'information que j'ais pu trouver. Il semblerait que l'union ne peut se faire qu'avec deux entités maximum ????? J'ai pensé également à récuperer les données de définition de la région mais je comprend pas ou l'on peut trouver les informations sur ses sommets et les différentes types d'objets qui la compose. Cet objet AutoCAD à l'air assez complexe à utiliser. Je ne pensais pas qu'il serait aussi compliqué de faire un programme comme ça !!!! Si quelqu'un à déjà rencontré le problème de la mise à jour des entités, son aide serait la bienvenue Merci
  7. Salut ludwig, il existe des fonctions visuallisp qui permettent ces modifications dans des listes: vl-remove : (vl-remove element-to-remove list) vl-remove-if : (vl-remove-if predicate-function list) vl-remove-if-not : (vl-remove-if-not predicate-function list) Des infos sont disponibles dans l'aide. Sinon sur le forum "routines lisp" il y a un post très interessant sur ce genre de routine avec les particularités du langage Lisp c'est ici : http://www.cadxp.com/sujetXForum-5535.htm
  8. Il n'existe pas de commande directe mais en Lisp tu peux utiliser cette routine : (defun c:pagp () (setq dictgroup (dictsearch (namedobjdict) "acad_group")) (setq dictgroup (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= 350 (car x))) dictgroup ) ;_ Fin de vl-remove-if-not ) ;_ Fin de mapcar ) ;_ Fin de setq (initget "Oui Non") (setq reponse (getkword (strcat "\nIl y a " (itoa (length dictgroup)) " groupes dans le dessin, voulez vous les supprimer ? [Oui/Non] :" ) ;_ Fin de strcat ) ;_ Fin de getkword ) ;_ Fin de setq (if (equal reponse "Non") (exit) ) ;_ Fin de if (setq i 0 ) ;_ Fin de setq (repeat (length dictgroup) (entdel (nth i dictgroup)) (setq i (1+ i)) ) ;_ Fin de while (princ (strcat "\n" (itoa i) " groupes ont été suprimés.")) (princ) ) ;_ Fin de defun (prompt "Tapez PAGP pour lancer la commande")
  9. Est il possible d'enlever des sommets sur une polyligne à partir du VisualLisp. Il existe la méthode AddVertex, peut-être existe-t-il la méthode RemoveVertex ? :P
  10. En fait tu veux faire un programme d'imbrication d'objet sur une surface donnée ? Si c'est ça, tu t'attaque à un problème compliqué. IL n'existe encore aucune fonction d'imbrication
  11. Titifonky

    Selection par calque

    En fait ce petit programme me permet de travailler avec des accrochages aux objets sur des objets n'appartenant pas au même calque tout en ne selectionnant que les objets du calque filtre comme si les autres calques serait des XREF. Ca permet également de selectionner un objet quand ils sont superposés. Je n'avais pas pensé à la commande Qselect, le problème avec cette commande c'est qu'elle ne fonctionne pas en transparence, il faut appeller la fonction puis selectionner les objets. Si tu connais une autre solution ca m'interresse. J'ai remarqué que le filtrage ne fonctionne pas pendant la selection au cours d'une commande, le reacteur ne réagit pas. La solution serait peut-être de verrouiller les autres calques pour avoir également un filtrage pendant les commandes ? Ton programme est interressant mais il ne permet pas de filtrer en temps réel les objets manipulés. Le gros défaut de mon programme est sa complexité, j'ai du inclure plusieurs boucle pour que le réacteur ne réagisse pas à la modification du jeu de selection principale (sssetfirst) pendant l'execution du programme. Ca le ralentit quand le nombre d'objets selectionnés devient important.
  12. Voici un programme qui permet de selectionner seulement les objets présent sur un calque donné. Tapez "sc" sur la ligne de commmande pour selectionner le calque filtre ou désactiver le filtre de selection. ;;selection du calque filtre ou desactivation de la selection par calque (defun c:sc () ;; flag : variable permettant de savoir si la selection par calque est activé ou non (if (equal flag 'nil) (setq flag 0) ) ;_ Fin de if (cond ((zerop (fix flag)) (setq flag 1)) ((>= flag 1) (setq flag 0)) ) ;_ Fin de cond (princ (strcat "\nSelection par calque " (if (zerop flag) (princ "desactivé") (princ "activé") ) ;_ Fin de if ) ;_ Fin de strcat ) ;_ Fin de princ (if (not (zerop flag)) (progn (setq c_layer (vla-get-layer (vlax-ename->vla-object (car (entsel "\nSelectionnez le calque de filtre :") ) ;_ Fin de car ) ;_ Fin de vlax-ename->vla-object ) ;_ Fin de vla-get-layer ) ;_ Fin de setq (princ (strcat "\nLe calque filtre est " c_layer)) ) ;_ Fin de progn ) ;_ Fin de if (princ) ) ;_ Fin de defun ;;reaction (defun choix_reac2 (a b) (if (equal setfirst nil) (setq setfirst (ssadd)) ) ;_ Fin de if (if (and (not (equal (cadr (ssgetfirst)) nil)) (not (equal c_layer nil)) ) ;_ Fin de and (progn (if (not (equal (sslength (cadr (ssgetfirst))) (sslength setfirst)) ) ;_ Fin de not (cond ((and (cadr (ssgetfirst)) (= flag 1)) (setq nb_sel (sslength (setq sel (cadr (ssgetfirst)))) i 0 setfirst nil set_ent (ssadd) ) ;_ Fin de setq (repeat nb_sel (setq ent (ssname sel i)) (if (not (equal ent nil)) (progn (if (equal (vla-get-layer (vlax-ename->vla-object ent)) ;_ Fin de vla-get-layer c_layer ) ;_ Fin de equal (ssadd ent set_ent) ) ;_ Fin de if ) ;_ Fin de progn ) ;_ Fin de if (setq i (1+ i)) ) ;_ Fin de repeat (setq setfirst set_ent) (sssetfirst nil set_ent) (princ (strcat "\n" (itoa (sslength set_ent)) " objet(s) selectioné(s) - " "Calque filtre : " c_layer ) ;_ Fin de strcat ) ;_ Fin de princ (setq set_ent nil) ) ;_ Fin de cond ) ;_ Fin de cond ) ;_ Fin de if ) ;_ Fin de progn (setq setfirst nil) ) ;_ Fin de if ) ;_ Fin de defun (vlr-remove reac) ;;reacteur de selection (setq reac (vlr-miscellaneous-reactor nil '((:vlr-pickfirstModified . choix_reac2)) ) ;_ Fin de vlr-object-reactor ) ;_ Fin de setq Attention, si le dessin comporte beaucoup d'objets (à partir de 5000) le filtrage peut demander quelques seconde. [Edité le 13/4/2005 par Titifonky]
  13. Merci Rebcao, Je viens de trouver le problème il y a quelques instants, c'était la selection nom/verbe
  14. Bonjour, Il vient de m'arriver un incident benin mais très désagréable, je ne sais pas quel manip j'ai pu faire mais ma touche Suppr ne fonctionne plus. Je suis obligé d'utiliser l'icône Effacer pour supprimer les objets !!! Es-ce-que quelqu'un à déjà eu ce problème et sais comment y remédier ?
  15. Merci, c'est parfait
  16. Bonjour, Je suis tombé sur un dessin d'archi dont les vues et les scu dans les fenetres de l'espace papier étaient tournées. J'ai essayé de faire la même chose avec la commande "pointvue" mais autocad ne veut pas prendre en compte les modifications. L'angle X reste toujours à 270 Existe t-il une variable empechant cette modification ?
  17. J'ai recherché dans l'aide AutoCAD et j'ai pu trouver quelques informations Voici la syntaxe d'un menu popup à inserer dans le fichier AutoCAD.mns et AutoCAD.mnu. Il est possible de stocker des info dans les variables users1-5 puis de les recuperer avec du langage Diesel. Le menu suivant permet de rendre un calque actif suite à l'appele dans un programme LISP par (menucmd "POP25=PERSO") -> charge le menu (menucmd "POP25=*) -> fait apparaitre le menu ***POP25 **PERSO [Menu Perso] ID_Users1 [$(if,$(eq,$(getvar,users1),""),~,$(eval,$(getvar,users1)))]^P(setvar "clayer" (getvar "users1"))^P; ID_Users2 [$(if,$(eq,$(getvar,users2),""),~,$(eval,$(getvar,users2)))]^P(setvar "clayer" (getvar "users2"))^P; ID_Users3 [$(if,$(eq,$(getvar,users3),""),~,$(eval,$(getvar,users3)))]^P(setvar "clayer" (getvar "users3"))^P; ID_Users4 [$(if,$(eq,$(getvar,users4),""),~,$(eval,$(getvar,users4)))]^P(setvar "clayer" (getvar "users4"))^P; ID_Users5 [$(if,$(eq,$(getvar,users5),""),~,$(eval,$(getvar,users5)))]^P(setvar "clayer" (getvar "users5"))^P; Cela permet de rendre un programme plus interactif
  18. Merci Bonuscad pour ce prog mais je ne parlais pas de ce type de menu contextuel, en fait je parle d'un menu qui apparait au bout du pointeur de type menu acrochage au objet [shift + click droit] mais qui sois appelé par un programme Lisp. Je connais la fonction "menucmd" mais elle ne permet pas de faire un menu modifiable. Je voudrais pouvoir obtenir au cours de mon programme un menu de ce type qui apparait pour pouvoir selectionner un calque mais comme le nom et le nombre de calque change au cours du dessin ce menu doit être modifiable. Si quelqu'un a une idée, peut-être faut-il programmer en Vba.
  19. Bonjour roultabille, Je ne sais pas si c'est le bon endroit pour en parler mais il existe un logiciel "Rhino 3d" qui permet de faire le developpement de toutes sortes de surfaces. Il gere beaucoup mieux les splines qu'autocad puisqu'il est spécialisé dans les courbes NURBS. Il existe également plusieurs type de developpement suivant le résultat souhaité.
  20. Bonjour, J'aimerais savoir si c'est possible de faire apparaître un menu contextuel de la même forme que celui qui apparait quand on fait Shift+clic droit au cours d'un programme lisp. En fait, je voudrais faire ce menu pour avoir une liste de choix à l'écran mais qui disparaisse après avoir fait la selection. J'ai recherché en DCL mais la boite de dialogue apparait toujours avec un titre.
  21. Bonjour, Est il possible d'imprimer des plans autocad avec des caractères rempli ? Pour le moment, j'utilise la police "Stylus BT" et je n'ai que les contours de la polices en impression. Pourtant, sur le dessin elles apparaissent remplie. Faut-il changer de police ou existe-il un option à modifier ? Merci
  22. Merci bonuscad pour ton programme, je ne connaissais pas la fonction ssgetfirst. Avec le reacteur ":vlr-pickfirstModified" je peux recuperer la selection courante en temps réel. En fait, pour repondre à bonuscad, la reaction ne doit se faire que si on selectionne un objet. Une fonction doit verifier, à l'appel du reacteur, s'il n'y a pas d'objet en dessous de celui selectionné. Maintenant, il me faudrait connaitre la position du curseur au moment de la selection pour savoir s'il y a d'autres objets en dessous. ;)
  23. Bonjour, Je cherche à faire un menu contextuel qui me permettrai de selectionner, dans le cas ou plusieurs objets sont superposés, l'objet que je veux dans le menu qui apparaît. :P Je recherche le réacteur qui réagit à la selection. J'ai trouvé le réacteur pour la souris "vlr-mouse-reactor" mais il ne réagit pas au clic gauche. J'ai également trouvé le réacteur ":vlr-pickfirstModified" mais il ne me renvoie aucune selection et aucun position de pointeur. Peut-être y a t-il un moyen de recuperer la selection en cours mais je ne connait pas la fonction. Si quelq'un à un idée cela pourrai m'avançer énormément parce qu'il ne me manque plus que ça. Merci
  24. Bonjour Comme je l'ai dit dans mon précédent message, la routine que j'ai rajouté permettant de rassembler les morceaux crées au cours de la division ne créer pas un nouveau groupe mais ajoute les morceaux au groupe d'origine. Si l'entité divisé n'appartient pas à un groupe aucun groupe ne seras créer. Mais dans tout les cas, tes quelques lignes de codes sont très interessantes. J'avais pour habitude de faire une boucle dans les cas ou j'avais besoin de repeter une commande du style "copy" avec cette solution je vais pouvoir alleger et simplifier le code de mes programmes. Merci :D
  25. Bonjour :D Voici un petit programme en VLisp pour diviser un objet en selectionnant les objets coupants. Ce programme est le resultat de l'assemblage de routines que j'ai fabriqué (groupes) ou que j'ai trouvé sur le très bon site AfraLisp (VBlisp), ce qui m'a permit de réaliser ce programme assez rapidement mais il est très lourd. Comme j'utilise enormément la fonction groupe, j'ai rajouté une fonction qui ajoute les morceaux créées au groupe d'origine. La division ne fonctionne pas avec les blocs (defun addgroup (group /) (setq selectionset listent i 0 ) (while (< i (length selectionset)) (setq entname (list (cons 340 (nth i selectionset)))) (setq group (entmod (append group entname))) (setq i (1+ i)) ) (princ) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun isgroup (numeroent /) (setq groupnumero (cdadr (member '(102 . "{ACAD_REACTORS") (entget numeroent) ) ) ) (if groupnumero (progn (setq groupdef (entget groupnumero)) ;;test si groupnumero est bien un groupe (if (equal (cadr groupdef) '(0 . "GROUP")) (setq is T) (setq is nil) ) ) (setq is nil) ) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun c:diva (/ ssets acadDocument newsset ctr item) ;load the visual lisp extensions (vl-load-com) ;retrieve a reference to the documents object (setq acadDocument (vla-get-activedocument (vlax-get-acad-object) ) ) ;retrieve a reference to the selection sets object (setq ssets (vla-get-selectionsets acadDocument)) (setq entname (car (entsel "\nSelectionnez l'objet à couper : "))) (setq selstyle (getvar "PICKSTYLE")) (setvar "PICKSTYLE" 0) (setq obj1 (vlax-ename->vla-object entname)) ;add a new selection set (setq newsset (vla-add ssets "SS1")) ;select your new selection set objects (princ "\nSelectionnez les objets coupants :") (vla-selectOnScreen newsset ) ;set the counter to zero (setq ctr 0) (setq int1 '(nil)) ;count the number of objects and loop (repeat (vla-get-count newsset) ;retrieve each object (setq item (vla-item newsset ctr)) (setq int (vla-IntersectWith obj1 item acExtendNone)) (setq int1 (append int1 (vlax-safearray->list (vlax-variant-value int)) ) ) ;increment the counter (setq ctr (1+ ctr)) ) ;repeat ;delete the selection set (vla-delete (vla-item ssets "SS1")) (setq int1 (cdr int1)) (setq int2 '(nil) i 0 ) (if (not (equal entname (entlast))) (command "_draworder" entname "" "d" (entlast)) ) (setq derent (entlast)) (if (equal (assoc 0 (entget entname)) '(0 . "CIRCLE")) (progn (setq os (getvar "osmode")) (setvar "osmode" 512) (setq pt1 (list (nth i int1) (nth (1+ i) int1) (nth (+ 2 i) int1)) ) (setq i (+ 3 i)) (setq pt2 (list (nth i int1) (nth (1+ i) int1) (nth (+ 2 i) int1)) ) (setq pt3 (cdr (assoc 10 (entget entname))) ) (command "_break" pt1 pt2) (command "arc" pt1 "f" pt2 pt3) (setq i (+ 3 i)) (setvar "osmode" os) ) ) (while (< i (length int1)) (setq ptint (list (nth i int1) (nth (1+ i) int1) (nth (+ 2 i) int1)) ) (command "_BREAK" ptint ptint) (setq i (+ 3 i)) ) (setq derent (entnext derent)) (setq entfinal (entlast)) (setq listent '(nil)) (while (not (equal derent entfinal)) (setq listent (append listent (list derent))) (setq derent (entnext derent)) ) (setq listent (append listent (list entfinal))) (setq listent (cdr listent)) (isgroup entname) (setq group groupdef) (if is (addgroup group) ) (setvar "PICKSTYLE" selstyle) (princ) )
×
×
  • 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é