Aller au contenu

GEGEMATIC

Membres
  • Compteur de contenus

    1 416
  • Inscription

  • Dernière visite

  • Jours gagnés

    19

Tout ce qui a été posté par GEGEMATIC

  1. Salut Patrick, J'utilise depuis des années ta technique d'ouverture des dessin via ObjectDbx, et c'est vraiment pratique pour faire des tas de traitement silencieusement ... J'ai beaucoup bossé sur les mystères des xref, et notamment sur le fait qu'il n'y a rien pour changer le type, attacher ou niveau : Le lisp est la seule manière d'y arriver, il n'y a ni méthode ni propriété en com et .net Il me reste à adapter le code ci dessous à ObjectDbx, car les xref attachées sont la pire idée qu'Autodesk ai eu: L'ouverture de dessins avec des xref croisées peut prendre des plombes, et on ne maitrise plus la hiérarchie de la résolution des xrefs. **************************************************************************** ;;§/xref/change l'occurence de block en xref de type overlay /eInsert-oInsert (defun c:MakeXrefOverlay ( / nom blocks ) (setq eblockref (enam)) (setq oblock (pw_retoBlock eblockref)) (if (= :vlax-true (vla-get-isxref oblock)) (progn (setq eblock (pw_to_ename oblock)) (setq egBlock (entget eblock)) (setq Flags (cdr (assoc 70 egBlock))) (if (= (boole 1 Flags 8) 8) ; that means that this block in an overlay xref (prompt "\nAllready Overlay xref") (progn (setq flags (+ 8 flags)) (pw_entmodifi eblock 70 flags) (prompt "\nChanged to Overlay xref") ) ) ) (prompt "\nNot an xref") ) ) ; **************************************************************************** ;;§/xref/retourne le eblockdef si le bloc est une xref/ebloc (defun pw_IsXref ( ebloc / nom bdef flags) (setq nom (vla-get-EffectiveName (pw_to_object ebloc))) (setq bdef (tblsearch "block" nom)) (setq Flags (cdr (assoc 70 bdef))) (if (member 4 (pw_l_flag flags)) bdef nil ) ) ; **************************************************************************** ;;§/xref/retourne le oblock de l'occurence de block /eInsert-oInsert (defun pw_retoBlock ( ebloc / nom blocks ) (setq nom (vla-get-EffectiveName (pw_to_object ebloc))) (setq blocks (vla-get-blocks pw-acaddocument)) (vla-item blocks nom) ) ;
  2. GEGEMATIC

    Orientation de matériaux

    Justement, C'est ce que j'ai cherché à faire dans un 1er temps, et je ne comprends pas pourqoi ça a fonctionné sur un solide, et pas sur un autre : Sur le 1er solide, la rotation dans l'éditeur de matériau était répercutée tout de suite, sur le 2eme, rien ne se passait Bizarre Bizarre ...
  3. salut, dans le manuel de la version 305.93, cette rubrique présente dans le 297.03 à disparu : Open Issues in Version 297.03 Windows Vista/Windows 7 64-bit Issues Reduced performance is experienced with Release 295 drivers compared to the previous driver release. ça laisse présager que la 305.93 serait encore plus rapide ... Attention, chez nvidia, il y a beaucoup de confusion possible : - la 297.03 contient le driver 295 - la 305.93 contient le driver 304 ....
  4. GEGEMATIC

    Orientation de matériaux

    Merci ! c'est vraiment trop con cette commande ! Je l'ai cherchée partout !
  5. salut, Donc je viens de passer d' un driver 275.33 au nouveau ODE 297.03 (dans mes benchmarks, j'avais essayé un 296 qui n'était pas convaincant ) Chez moi, la différence est spectaculaire : Sur le même dessin, en orbite libre, la dégradation intervient beaucoup plus tard que tout à l'heure, et je repasse en mode réaliste aussitôt. j'ai eu un gros ralentissement en zoomant progressivement en arrière pour voir beaucoup d'entité 2d. Une fois ce cap passé, l'orbite libre est fluide même avec les entités 2d visibles, pas vu ça depuis le nvidia performance ! 2eme test, le gripage et l'étirement de faces 3d avec texture: sur un pilote gammer, les arêtes ne sont pas en face des grips, et pas raccord avec les ombres : là tout est OK je revis !
  6. Bonjour, Sous A2012, j'avais un petit rendu à faire. J'ai créé un matériau plancher "vieux bois", et je dois l'appliquer à un certain nombre d'entités. Ce matériaux a donc un "sens", les planches devant s'orienter comme je le souhaite. 1 er objet, un bloc comportant un solide 3d, c'est tout de suite bon. 2 eme objet (solide 3d cré à partir d'une extrusion, puis oté de plusieurs éléments), 90 degré par rapport à ce que je veux : Je duplique mon matériaux, je lui mets le suffixe "vertical", je tourne l'image bump de 90°, ça marche. 3 eme objet: un rectangle xtrudé en paralélépipède : Les rayures sont dans le mauvais sens: J'essaye l'astuce d'avant: pas de changement ! Je crée un autre solide, extrudé dans l'autre direction,je lui applique le matériau, c'est bon, je le tourne en 3d, et la, les rayures se réalignent dans le mauvais sens ! j'ai finalement réussi avec un bloc, créé dans un scu et inséré dans un autre, je ne saurais pas le refaire ... Ya pas plus simple ? ou est le paramètre qui me manque ? Merci d'avance, Gérald
  7. Bonjour, je vais tester les drivers ODE Pour les pilotes constructeur, on voit que c'est pareil chez ATI : plus de drivers performance depuis la version 2011. en attendant, pour pouvoir travailler en 3d, il faut désactiver le bel environnement windows 7, et geler les calques contenant des entités 2d (le 2d étant le point faible des cartes 3d) j'ai mis tout ça la Benchmark Cadalyst : Test avec Autocad 2011, 2012 et 2013, sans aero peek Il y a une grande liste de paramètre, ce serait bien de faire des test un par un pour savoir lesquels ont le + d'impact. Car je viens de passer l'après midi dans ce mode d'affichage, et j'ai les yeux cramés ... Mais j'ai pu travailler en 3d de manière très fluide ...
  8. Donc voila la même chose en utilisant invoke() J'ai ajouté une astuce pour s'affranchir du vl-acad-defun de tout ce que l'on va évaluer par .Net, le recours à eval Donc dans mon AcadExtension.vb 'Classe pour évaluation lisp dans .net 'ajoutée le 20/09/2012 'http://www.theswamp.org/index.php?topic=35714.0 'LispDataType 'None 5000 'Double 5001 'Point2d 5002 'Int16 5003 'Angle 5004 'Text 5005 'ObjectId 5006 'SelectionSet 5007 'Orientation 5008 'Point3d 5009 'Int32 5010 'Void 5014 'ListBegin 5016 'ListEnd 5017 'DottedPair 5018 'Nil 5019 'T_atom (T) 5021 'PromptStatus 'None 5000 'Modeless 5027 'Other 5028 'OK 5100 'Keyword -5005 'Cancel -5002 'Error -5001 Imports System.Runtime.InteropServices Imports Autodesk.AutoCAD.DatabaseServices Imports Autodesk.AutoCAD.EditorInput Imports Autodesk.AutoCAD.Runtime Namespace AcadExtensions ' Credits to Tony Tanzillo, Alexander Rivilis, Kerry Brown... ''' <summary> ''' Provides methods to comunicate with AutoLISP. ''' </summary> Public Class LispExtensions ''' <summary> ''' Invoke a LISP function using managed invoke() method. ''' The LISP function must be defined as an external subroutine using the c: prefix or invoking vl-acad-defun. ''' This is no more mandatory since A2011 as the managed Application.Invoke() method wraps acedInvoke. ''' </summary> ''' <param name="args">The function name (string) following by the function arguments.</param> ''' <returns>The LISP function return value or null if failed.</returns> Public Shared Function InvokeLispManaged(ByVal args As ResultBuffer) As ResultBuffer Return Autodesk.AutoCAD.ApplicationServices.Application.Invoke(args) End Function 'accompagner cette commande la commande lisp suivante: '(defun ManagedGetLispSym ( strSym ) (eval (read strSym)))(vl-acad-defun 'ManagedGetLispSym) 'par commodité, on peut la créer automatiquement au chargement Public Shared Function ManagedGetLispSym(ByVal name As String) As ResultBuffer Dim input As New ResultBuffer( New TypedValue(CInt(LispDataType.Text), "ManagedGetLispSym"), New TypedValue(CInt(LispDataType.Text), name)) 'à ce stade, input ressemble à ça: ' "ManagedGetLispSym" "name" Return AcadExtensions.LispExtensions.InvokeLispManaged(input) End Function 'accompagner cette commande la commande lisp suivante: '(defun ManagedPutLispSym ( strSym RsbValue) (set (read strSym) RsbValue))(vl-acad-defun 'ManagedPutLispSym) ''' <summary> ''' Set a LISP variable value using managed invoke(). ''' </summary> ''' <param name="name">The variable name.</param> ''' <param name="rb">The variable value</param> Public Shared Function ManagedPutLispSym(ByVal name As String, ByVal rb As ResultBuffer) GetEditor.WriteMessage(vbLf & "Entrée ManagedPutLispSym:") Dim input As New ResultBuffer( New TypedValue(CInt(LispDataType.Text), "ManagedPutLispSym"), New TypedValue(CInt(LispDataType.Text), name) ) 'GetEditor.WriteMessage(vbLf & "Input") 'For Each tv As TypedValue In input 'GetEditor.WriteMessage(vbLf & "Type: {0}" & vbTab & "Value: {1}", tv.TypeCode, tv.Value) 'Next 'GetEditor.WriteMessage(vbLf & "Input + rb") 'rb.UnmanagedObject For Each val As TypedValue In rb input.Add(val) Next 'à ce stade, input ressemble à ça: ' "ManagedPutLispSym" "name" rbvalue 'For Each tv As TypedValue In input 'GetEditor.WriteMessage(vbLf & "Type: {0}" & vbTab & "Value: {1}", tv.TypeCode, tv.Value) 'Next Return AcadExtensions.LispExtensions.InvokeLispManaged(input) ' print the value to the commande line End Function 'Ajoute les parenthèses à un resultBuffer représentant une liste 'utile si on veut réutiliser un retour de fonction lisp comme arguments d'une autre fonction lisp Public Shared Function AddParenthesisToresultBuffer(ByVal rb As ResultBuffer) As ResultBuffer Dim tv() As TypedValue = rb.AsArray If (1 < UBound(tv, 1)) Then If Not (tv(0).TypeCode = 5016) Then GetEditor.WriteMessage(vbLf & "Liste sans parenthèses") Dim input As New ResultBuffer( New TypedValue(CInt(LispDataType.ListBegin)) ) 'Ajoute les valeurs For Each val As TypedValue In rb input.Add(val) Next input.Add(New TypedValue(CInt(LispDataType.ListEnd))) Return input Else Return rb End If Else Return rb End If End Function End Class End Namespace Et dans mon LispSample.vb : Imports Autodesk.AutoCAD.ApplicationServices Imports Autodesk.AutoCAD.DatabaseServices Imports Autodesk.AutoCAD.EditorInput Imports Autodesk.AutoCAD.Runtime 'necessaire quand est dans un autre module : 'Imports AcadExtensions 'lorsque qu'une autre classe de commands est présente dans le projet, il faut désactiver sa compilation pour que les 'CommandMethod fonctionnent Namespace LispVbsample Public Class Commands Implements IExtensionApplication Private ObjectData As System.Data.DataTable Public Sub AddDocColEventCreated() AddHandler Application.DocumentManager.DocumentCreated, _ AddressOf InitialiseLispExtension GetEditor().WriteMessage(vbNewLine & "Initialisation des exemples lisp par evenement") End Sub Private Sub InitialiseLispExtension() GetEditor().WriteMessage(vbNewLine & "Création des routines lisp utiles à AcadExtension par evenement sur la création de document ") Dim doc As Autodesk.AutoCAD.ApplicationServices.Document doc = Application.DocumentManager.MdiActiveDocument doc.SendStringToExecute("(defun ManagedGetLispSym ( strSym ) (eval (read strSym)))(vl-acad-defun 'ManagedGetLispSym) ", False, False, False) doc.SendStringToExecute("(defun ManagedPutLispSym ( strSym RsbValue) (set (read strSym) RsbValue))(vl-acad-defun 'ManagedPutLispSym) ", False, False, False) GetEditor().WriteMessage(vbNewLine & "Routines lisp ManagedGetLispSym ManagedPutLispSym créées ") End Sub Private Sub Initialize() Implements IExtensionApplication.Initialize ' Initialize your plug-in application here 'ajout de l'evenement pour les prochanis docs AddDocColEventCreated() InitialiseLispExtension() End Sub Private Sub Terminate() Implements IExtensionApplication.Terminate ' Do plug-in application clean up here End Sub 'la seule fonction exemple qui utilise invoke() <CommandMethod("ManagedEvalCustomLisp")> _ Public Sub ManagedEvalCustomLisp() Dim doc As Document = Application.DocumentManager.MdiActiveDocument Dim ed As Editor = doc.Editor Dim retour As ResultBuffer ' create a result buffer containing a LISP list Dim input As New ResultBuffer( New TypedValue(CInt(LispDataType.ListBegin)), New TypedValue(CInt(LispDataType.Int16), 12), New TypedValue(CInt(LispDataType.Text), "toto"), New TypedValue(CInt(LispDataType.T_atom)), New TypedValue(CInt(LispDataType.ListEnd))) ' bind the list to a 'lst1' LISP variable AcadExtensions.LispExtensions.ManagedPutLispSym("lst1", input) ' call the 'foo' Lisp function which binds the reversed list to 'lst2' ' (defun foo () (setq lst2 (reverse lst1))) (vl-acad-defun 'foo) 'Appel lisp en managé: retour = AcadExtensions.LispExtensions.InvokeLispManaged(New ResultBuffer(New TypedValue(CInt(LispDataType.Text), "foo"))) ' print the value to the commande line ed.WriteMessage(vbLf & "Retour fonction:") For Each tv As TypedValue In retour ed.WriteMessage(vbLf & "Type: {0}" & vbTab & "Value: {1}", tv.TypeCode, tv.Value) Next ed.WriteMessage(vbLf & "Lst2:") ' get the 'lst2' variable value Dim output As ResultBuffer = AcadExtensions.LispExtensions.ManagedGetLispSym("lst2") ' print the value to the commande line For Each tv As TypedValue In output ed.WriteMessage(vbLf & "Type: {0}" & vbTab & "Value: {1}", tv.TypeCode, tv.Value) Next ed.WriteMessage(vbLf & "Put lisp managé, création de la liste lst4 avec le retour de fonction, !lst4 pour vérification:") 'ajoute des parenthèses à retour retour = AcadExtensions.LispExtensions.AddParenthesisToresultBuffer(retour) 'version managée putLisp AcadExtensions.LispExtensions.ManagedPutLispSym("lst4", retour) End Sub End Class End Namespace A noter la création directe des deux routines lisp ManagedGetLispSym et ManagedPutLispSym, ce qui est bien pratique. Mais pour tester ManagedEvalCustomLisp, il ne faut pas oublier de définir (defun foo () (setq lst2 (reverse lst1))) (vl-acad-defun 'foo) à la ligne de commande.
  9. Salut, donc pour être clair, on peut remplacer InvokeLisp par Public Shared Function InvokeLispManaged(ByVal args As ResultBuffer) As ResultBuffer Return Autodesk.AutoCAD.ApplicationServices.Application.Invoke(args) End Function et pour tester : <CommandMethod("EvalCustomLisp")> _ Public Sub EvalCustomLisp() Dim doc As Document = Application.DocumentManager.MdiActiveDocument Dim ed As Editor = doc.Editor ' create a result buffer containing a LISP list Dim input As New ResultBuffer( New TypedValue(CInt(LispDataType.ListBegin)), New TypedValue(CInt(LispDataType.Int16), 12), New TypedValue(CInt(LispDataType.Text), "toto"), New TypedValue(CInt(LispDataType.T_atom)), New TypedValue(CInt(LispDataType.ListEnd))) ' bind the list to a 'lst1' LISP variable AcadExtensions.LispExtensions.SetLispSym("lst1", input) ' call the 'foo' Lisp function which binds the reversed list to 'lst2' ' (defun foo () (setq lst2 (reverse lst1))) (vl-acad-defun 'foo) AcadExtensions.LispExtensions.InvokeLisp(New ResultBuffer(New TypedValue(CInt(LispDataType.Text), "foo"))) 'suivant en managé: Dim retour As ResultBuffer retour = AcadExtensions.LispExtensions.InvokeLispManaged(New ResultBuffer(New TypedValue(CInt(LispDataType.Text), "foo"))) ' print the value to the commande line ed.WriteMessage(vbLf & "Retour fonction:") For Each tv As TypedValue In retour ed.WriteMessage(vbLf & "Type: {0}" & vbTab & "Value: {1}", tv.TypeCode, tv.Value) Next ed.WriteMessage(vbLf & "Lst2:") ' get the 'lst2' variable value Dim output As ResultBuffer = AcadExtensions.LispExtensions.GetLispSym("lst2") ' print the value to the commande line For Each tv As TypedValue In output ed.WriteMessage(vbLf & "Type: {0}" & vbTab & "Value: {1}", tv.TypeCode, tv.Value) Next End Sub Par contre, dans la mesure où il n'existe pas de methode putlisp ou getlisp, je pense qu'il faudrait les implémenter à partir de Invoke(), puisqu'on peut faire un invoke de la fonction (eval (read "mysym"))
  10. Bonjour, Gile avait déjà expliqué pas mal de choses dans un sujet vieux de 2 ans, mais on ne trouve rien de bien en forme sur le Web Pour faire une petite synthèse, en VB (nul n'est parfait) Voici ce que j'ai mis dans le fichier AcadExtensions.vb Il y a des auteurs crédités, mais je ne sais pas vraiment si ils sont les seuls à avoir participé: 'Classe pour évaluation lisp dans .net 'ajoutée le 20/09/2012 'http://www.theswamp.org/index.php?topic=35714.0 'LispDataType 'None 5000 'Double 5001 'Point2d 5002 'Int16 5003 'Angle 5004 'Text 5005 'ObjectId 5006 'SelectionSet 5007 'Orientation 5008 'Point3d 5009 'Int32 5010 'Void 5014 'ListBegin 5016 'ListEnd 5017 'DottedPair 5018 'Nil 5019 'T_atom (T) 5021 'PromptStatus 'None 5000 'Modeless 5027 'Other 5028 'OK 5100 'Keyword -5005 'Cancel -5002 'Error -5001 Imports System.Runtime.InteropServices Imports Autodesk.AutoCAD.DatabaseServices Imports Autodesk.AutoCAD.EditorInput Namespace AcadExtensions ' Credits to Tony Tanzillo, Alexander Rivilis, Kerry Brown... ''' <summary> ''' Provides methods to comunicate with AutoLISP. ''' </summary> Public Class LispExtensions <System.Security.SuppressUnmanagedCodeSecurity()> _ <DllImport("acad.exe", EntryPoint:="acedInvoke", _ CharSet:=CharSet.Unicode, CallingConvention:=CallingConvention.Cdecl)> _ Private Shared Function acedInvoke(ByVal args As IntPtr, ByRef result As IntPtr) As Integer End Function ''' <summary> ''' Invoke a LISP function. ''' The LISP function must be defined as an external subroutine using the c: prefix or invoking vl-acad-defun. ''' This is no more mandatory since A2011 as the managed Application.Invoke() method wraps acedInvoke. ''' </summary> ''' <param name="args">The function name (string) following by the function arguments.</param> ''' <returns>The LISP function return value or null if failed.</returns> Public Shared Function InvokeLisp(ByVal args As ResultBuffer) As ResultBuffer Dim ip As IntPtr = IntPtr.Zero Dim status As Integer = acedInvoke(args.UnmanagedObject, ip) If status = CInt(PromptStatus.OK) AndAlso ip <> IntPtr.Zero Then Return ResultBuffer.Create(ip, True) End If Return Nothing End Function <System.Security.SuppressUnmanagedCodeSecurity()> _ <DllImport("acad.exe", EntryPoint:="acedPutSym", _ CharSet:=CharSet.Unicode, CallingConvention:=CallingConvention.Cdecl)> _ Private Shared Function acedPutSym(ByVal args As String, ByVal result As IntPtr) As Integer End Function ''' <summary> ''' Set a LISP variable value. ''' </summary> ''' <param name="name">The variable name.</param> ''' <param name="rb">The variable value</param> Public Shared Sub SetLispSym(ByVal name As String, ByVal rb As ResultBuffer) acedPutSym(name, rb.UnmanagedObject) End Sub <System.Security.SuppressUnmanagedCodeSecurity()> _ <DllImport("acad.exe", EntryPoint:="acedGetSym", _ CharSet:=CharSet.Unicode, CallingConvention:=CallingConvention.Cdecl)> _ Private Shared Function acedGetSym(ByVal args As String, ByRef result As IntPtr) As Integer End Function ''' <summary> ''' Get a LISP variable value. ''' </summary> ''' <param name="name">The variable name.</param> ''' <returns>The variable value or null if failed.</returns> Public Shared Function GetLispSym(ByVal name As String) As ResultBuffer Dim ip As IntPtr = IntPtr.Zero Dim status As Integer = acedGetSym(name, ip) If status = CInt(PromptStatus.OK) AndAlso ip <> IntPtr.Zero Then Return ResultBuffer.Create(ip, True) End If Return Nothing End Function End Class End Namespace Puis voici ce que j'ai mis dans une classe de commande autocad : Vous pourrez donc tester quelques exemples réalisés à partir des exemples de Gile. (ne vous étonnez pas des commentaires naifs de mon cru que l'on trouve dans le code: Je note bêtement tout ce que je remarque et que je ne comprends pas ...) Imports Autodesk.AutoCAD.ApplicationServices Imports Autodesk.AutoCAD.DatabaseServices Imports Autodesk.AutoCAD.EditorInput Imports Autodesk.AutoCAD.Runtime 'necessaire quand est dans un autre module : 'Imports AcadExtensions 'lorsque qu'une autre classe de commands est présente dans le projet, il faut désactiver sa compilation pour que les 'CommandMethod fonctionnent Namespace LispVbsample Public Class Commands <CommandMethod("EvalCustomLisp")> _ Public Sub EvalCustomLisp() Dim doc As Document = Application.DocumentManager.MdiActiveDocument Dim ed As Editor = doc.Editor ' create a result buffer containing a LISP list Dim input As New ResultBuffer( New TypedValue(CInt(LispDataType.ListBegin)), New TypedValue(CInt(LispDataType.Int16), 12), New TypedValue(CInt(LispDataType.Text), "toto"), New TypedValue(CInt(LispDataType.T_atom)), New TypedValue(CInt(LispDataType.ListEnd))) ' bind the list to a 'lst1' LISP variable AcadExtensions.LispExtensions.SetLispSym("lst1", input) ' call the 'foo' Lisp function which binds the reversed list to 'lst2' ' (defun foo () (setq lst2 (reverse lst1))) (vl-acad-defun 'foo) AcadExtensions.LispExtensions.InvokeLisp(New ResultBuffer(New TypedValue(CInt(LispDataType.Text), "foo"))) ' get the 'lst2' variable value Dim output As ResultBuffer = AcadExtensions.LispExtensions.GetLispSym("lst2") ' print the value to the commande line For Each tv As TypedValue In output ed.WriteMessage(vbLf & "Type: {0}" & vbTab & "Value: {1}", tv.TypeCode, tv.Value) Next End Sub <CommandMethod("EvalCustomLispWithArg")> _ Public Sub EvalCustomLispWithArg() Dim doc As Document = Application.DocumentManager.MdiActiveDocument Dim ed As Editor = doc.Editor ' create a result buffer containing a LISP expression containing a function call, with a single list argument Dim input As New ResultBuffer( New TypedValue(CInt(LispDataType.Text), "fooArg"), New TypedValue(CInt(LispDataType.ListBegin)), New TypedValue(CInt(LispDataType.Int16), 12), New TypedValue(CInt(LispDataType.Text), "toto"), New TypedValue(CInt(LispDataType.T_atom)), New TypedValue(CInt(LispDataType.ListEnd))) 'à ce stade, input ressemble à ça: ' "fooArg" '( 12 "toto" 'T) 'On note que les parenthèses de l'évaluation de la fonction ne sont pas nécessaires, mais celles de la liste d'arguments le sont 'si la fonction accepte plusieurs arguments, pas de parenthèses ! 'copier coller suivant dans fenetre texte autocad pour définition fooarg : ' (defun fooArg ( lst1 ) (setq lst2 (reverse lst1))) (vl-acad-defun 'fooArg) ' call the 'fooArg' Lisp function which binds the reversed list to 'lst2' AcadExtensions.LispExtensions.InvokeLisp(input) ' get the 'lst2' variable value Dim output As ResultBuffer = AcadExtensions.LispExtensions.GetLispSym("lst2") ' print the value to the commande line For Each tv As TypedValue In output ed.WriteMessage(vbLf & "Type: {0}" & vbTab & "Value: {1}", tv.TypeCode, tv.Value) Next End Sub <CommandMethod("EvalAutoLispWithArg")> _ Public Sub EvalAutoLispWithArg() ' create a result buffer containing a LISP list Dim input As New ResultBuffer( New TypedValue(CInt(LispDataType.Text), "Alert"), New TypedValue(CInt(LispDataType.Text), "toto a zéro")) 'copier coller suivant dans fenetre texte autocad pour définition commande autolisp "alert" '(vl-acad-defun 'alert) ' call the 'fooArg' Lisp function which binds the reversed list to 'lst2' AcadExtensions.LispExtensions.InvokeLisp(input) End Sub 'conclusion: on peut tout faire avec le lisp 'contrainte : définir chaque commande lisp appelée par .Net avec un vl-acad-defun (pas besoin de c:) 'même les commandes autolisp natives ont besoin de ce vl-acad-defun ! 'donc il vaut mieux bien organiser son code lisp pour grouper les intéractions avec .net End Class End Namespace
  11. salut, quelle déception, ce SP ne résout pas mon problème de surfaces qui ne s'affichent pas ...
  12. Les truc avec command, c'est toujours des trucs à embrouille: si le calque est verrouillé, il faut le controller, tu n'en finis pas. j'aimerai bien savoir ou se trouve cette info ...
  13. Bonjour, J'ai d’anciennes commandes qui utilisent la sélection précédente, (ssget "_p") Le problème, c'est que parfois, la sélection précédente n'est pas celle quel l'on veut, il faudrait pouvoir réinitialiser le select p J'ai cherché un peu partout propriété du document : ActiveSelectionSet SelectionSets PickfirstSelectionSet ou utiliser la méthode add sur Document.SelectionSets, et laisser ce ss vide. Rien ne marche. seule astuce qui marche, mais qui fait un peu couillon: (command "_point" 0,0)(entdel (entlast)) ou diable ce cache ce ssget "p" ?
  14. GEGEMATIC

    Aide ActiveX

    salut, oui la nouvelle aide est horripilante, et en plus, le bouton d'aide du visual lisp n'aboutis à rien ! Par miracle, on peut accéder à l'aide vlisp par le service des symboles, aide, là on arrive sur le catalogue de fonctions lisp. Utilisant MAP depuis longtemps, je suis habitué à ne pas avoir toute l'aide intégrée: J'ai donc sur le bureau un raccourcis vers le répertoire help d'autocad, et un raccourcis vers l'aide Vlisp d'autocad 2010. Avant que l'on passe de l'HLPw32 aux CHM, on pouvait agréger plusieurs fichiers d'aide, et donc créer son aide perso, en ajoutant par exemple l'aide de ses propres bibliothèques. C'est pour ça que j'avais créé un système de recherche et documentation inspiré d'unix, MAN, qui permettait de créer sa propre documentation. Man permet de créer des fichier Html, que l'on doit pouvoir compiler en chm, mais je ne sais pas agréger plusieurs chm: peut être en les décompilant ?
  15. Bonjour, merci de cette réponse, sous Autocad 2010, j'ai eu des erreurs avec l'utilisation des arguments de Highlight : subId As FullSubentityPath, highlightAll As [MarshalAs(UnmanagedType.U1)] bool Je n'avais pas ce problème en utilisant highlight sans arguments Je pensais que suBid permettait de gérer les sous entités des blocs, ce qui aurait permis de changer l'apparence des entités dont les caractéristiques n'étaient pas "dubloc" Les liens que tu donne pour Overrules et TransientManager sont ceux que j'ai utilisé pour mes recherches Mon problème c'est la réelle compréhension de Overrules: J'ai réussi à faire fonctionner overrules, mais Je n'ai pas réussi à l'adapter à mon problème, car je pense que je n'ai pas compris le concept. Transient fonctionne, mais pas avec les blocs. Je vais donc utiliser Editor.DrawVector et Editor.DrawVectors, dont je devrais comprendre le fonctionnement sans peine ... merci, Gérald
  16. Salut, Je cherche un moyen d'améliorer le highlight de base des entités. Pour la compatibilité avec A2010, je ne peux pas utiliser les arguments de Highlight : subId As FullSubentityPath, highlightAll As [MarshalAs(UnmanagedType.U1)] bool Ce que je veux, c'est mettre en évidence des entités qui ne sont pas survolées par la souris, mais sélectionnées depuis un tableau. J'ai testé la méthode HighlightOverrule, qui fonctionne mais a provoqué un crash net d'Autocad, et je n'ai pas réussi à l'adapter à mon cas, je n'ai pu la faire fonctionne qu'avec le survol souris. J'ai utilisé la méthode TransientManager Methods, avec l'attribut DirectShortTerm, je n'ai pas testé les autres (je n'ai pas compris leur utilité): Main Sprite DirectShortTerm Highlight DirectTopmost Contrast Mais elle ne donne pas de très bon résultats avec les blocs, et aucun avec les points. Pour moi, l'idéal pour les blocs et les points, serai de dessiner une rectange temporaire autour, genre celui de getcorner, ou comme ce que l'on peut faire avec grdraw en lisp Je n'ai pas trouvé l'équivalent en .Net, mais j'ai tellement à découvrir ! j'ai également trouvé la propriété HighlightStyle de Autodesk.AutoCAD.GraphicsSystem Qui a ces valeurs: None Custom DashedAndThicken Dim ThickDim Mais je n'ai pas compris comment les utiliser. Si quelqu'un a une idée ? merci d'avance, Gérald
  17. Salut, je ne l'ai pas non plus avec c# par contre, avec C#, j'ai l'option commenter/décommenter, mais avec VB, je ne l'ai pas ... on a pas les même touche de débogage en C# et en VB F8 ou F11, donc passer de l'un à l'autre, c'est un peu déroutant.
  18. Je t'ai fait une capture d'écran pour etre sur que l'on parle bien de la même chose ... je suis sous visual studio express, mais j'ai l'editeur visual basic express ...
  19. salut, chez moi, visual studio express 2010 + seven 64, la commande supprimer tous les points d'arrêt marche très bien tu es sous 2008 ?
  20. Salut Patrick, C'est ce que j'ai pensé aussi, et j'ai perdu du temps pour rien, car en fait, de petites variations dans la structure d'imbrications que je n'avais pas anticipé font que ce n'est pas très adapté à la récursion. finalement, j'en suis resté à un programme bien lourdingue !
  21. Je crois que tu as trouvé un vrai "client" dans pas longtemps vous dicuterez tous les 2, et on y comprendra rien ...
  22. Salut, Il doit y avoir plus joli (Gile, Patrick, Bruno ???) , mais voici une vieille collection de fonctions pour traiter ce problème. le pré requi est d'avoir PowerClic installé : http://g-eaux.over-blog.com/article-installation-et-mise-a-jour-de-powerclic-pour-autocad-98003399.html Si les z incriminés viennent d'une application tierce, et dépassent les 1099, aucune commande à l'intérieur d'Autocad ne marchera. (pas même en arx, on avait vu ça avec Kamal Boutora) La SEULE solution, c'est d'exporter au format DXF, et de changer les z pourris avec un editeur, genre Notepad ++. ;; distribué tel quel, sans garantie. ; G-EAUX Gérald Lemoine 1/6/2005 ;;**************************************************************************************** ;;§/dxf/definit tous les cordonées en z à 0/none ;;ne permet pas de choisir les entitées, mais traite toutes les entitées, 3dpoly incluses ; (defun c:proj2d_all ( / z) (defun to_Z0 ( ent / tmp eg) (setq eg (entget ent)) (if (setq z (cadddr (setq tmp (assoc 10 eg)))) (if (not (= 0 z)) (progn (setq repl (list 10 (cadr tmp) (caddr tmp) 0)) (setq eg (subst repl tmp eg)) (entmod eg) ;(print eg) (entupd ent) ) ) ) (if (setq z (cadddr (setq tmp (assoc 11 eg)))) (if (not (= 0 z)) (progn (setq repl (list 11 (cadr tmp) (caddr tmp) 0)) (setq eg (subst repl tmp eg)) (entmod eg) ;(print eg) (entupd ent) ) ) ) (if (setq z (cadddr (setq tmp (assoc 12 eg)))) (if (not (= 0 z)) (progn (setq repl (list 12 (cadr tmp) (caddr tmp) 0)) (setq eg (subst repl tmp eg)) (entmod eg) ;(print eg) (entupd ent) ) ) ) (if (setq z (cadddr (setq tmp (assoc 13 eg)))) (if (not (= 0 z)) (progn (setq repl (list 13 (cadr tmp) (caddr tmp) 0)) (setq eg (subst repl tmp eg)) (entmod eg) ;(print eg) (entupd ent) ) ) ) (if (setq z (cdr (setq tmp (assoc 38 eg)))) (if (not (= 0 z)) (progn (setq repl (cons 38 0)) (setq eg (subst repl tmp eg)) (entmod eg) ;(print eg) (entupd ent) ) ) ) ) (setq ent (entnext)) (to_Z0 ent) ;(print eg) (while (setq ent (entnext ent)) (to_Z0 ent) ;(print eg) ) ;;aplati les blocs (c:block_def_to_z0) ) ;;**************************************************************************************** ;;§/dxf/definit tous les cordonées en z à 0 des entités choisies/none ;;permet de choisir les entitées, mais traite ne traite pas toutes les entitées ; (defun c:proj2d ( / z ) (defun to_Z0 ( eg / tmp ) (if (setq z (cadddr (setq tmp (assoc 10 eg)))) (if (not (= 0 z)) (progn (setq repl (list 10 (cadr tmp) (caddr tmp) 0)) (setq eg (subst repl tmp eg)) (entmod eg) ;(print eg) (entupd ent) ) ) ) (if (setq z (cadddr (setq tmp (assoc 11 eg)))) (if (not (= 0 z)) (progn (setq repl (list 11 (cadr tmp) (caddr tmp) 0)) (setq eg (subst repl tmp eg)) (entmod eg) ;(print eg) (entupd ent) ) ) ) (if (setq z (cadddr (setq tmp (assoc 12 eg)))) (if (not (= 0 z)) (progn (setq repl (list 12 (cadr tmp) (caddr tmp) 0)) (setq eg (subst repl tmp eg)) (entmod eg) ;(print eg) (entupd ent) ) ) ) (if (setq z (cadddr (setq tmp (assoc 13 eg)))) (if (not (= 0 z)) (progn (setq repl (list 13 (cadr tmp) (caddr tmp) 0)) (setq eg (subst repl tmp eg)) (entmod eg) ;(print eg) (entupd ent) ) ) ) (if (setq z (cdr (setq tmp (assoc 38 eg)))) (if (not (= 0 z)) (progn (setq repl (cons 38 0)) (setq eg (subst repl tmp eg)) (entmod eg) ;(print eg) (entupd ent) ) ) ) ) (setq sel (ssget)) (setq lsel (pw_listsel sel)) ;(print eg) (foreach ent lsel (setq eg (entget ent)) (to_Z0 eg) (setq tp_ent (cdr (assoc 0 eg))) (cond ((= "3DPOLY" tp_ent) (prompt "\n3dpoly pas applatie !") ) ((= "INSERT" tp_ent) (prompt "\napplati la definition du bloc ...") (setq nbl (cdr (assoc 2 eg))) (block_def_z0 nbl) ) ) ;(print eg) ) ) ;; **************************************************************************** ;;§/dxf/aplati la definition de tous les blocs du dessin /none (defun c:block_def_to_z0 ( / lbloc nbl) (setq lbloc (pw_list_tabl "BLOCK")) (setq lxref (PW_LIST_XREF)) (setq lbloc (pw_l1-l2 lbloc lxref)) (foreach nbl lbloc (prompt "\napplati la definition du bloc ...") (print nbl) (block_def_z0 nbl) ) ) ; **************************************************************************** ;;§/dxf/applati la definition d'un bloc /nombloc ;;nombloc = intitulé du bloc ;; (defun block_def_z0 ( nb / i ldef ) (setq ldef (pw_block_def nb)) (foreach def ldef (setq def (mapcar 'pw_zfromlist_to_zero def)) (prompt "\nmodifie 1") (print (entmod def)) ) ) ;;**************************************************************************** ;;§/dxf/pour un element d'une liste de entget, place z à 0/lst ;;lst du gener '(10 105.65 120.36 47.0) -> (10 105.65 120.36 0) (defun pw_zfromlist_to_zero ( lst / z ) (cond ((= 10 (car lst)) (setq z (last lst)) (if (not (= 0 z)) (list 10 (cadr lst) (caddr lst) 0.0) lst ) ) ((= 11 (car lst)) (setq z (last lst)) (if (not (= 0 z)) (list 11 (cadr lst) (caddr lst) 0.0) lst ) ) ((= 12 (car lst)) (setq z (last lst)) (if (not (= 0 z)) (list 12 (cadr lst) (caddr lst) 0.0) lst ) ) ((= 13 (car lst)) (setq z (last lst)) (if (not (= 0 z)) (list 13 (cadr lst) (caddr lst) 0.0) lst ) ) ((= 38 (car lst)) (setq z (cdr lst)) (if (not (= 0 z)) (cons 38 0.0) lst ) ) ;;; ((pw_listp (car lst)) ;;; (pw_zfromlist_to_zero lst) ;;; ) (T lst ) ) )
  23. Salut, ben tu vois, j'avais besoin de comprendre une bonne fois cette arbordescence compliquées pour pouvoir comprendre comment c'est foutu: la fonction ci dessous déroule les menus, et donc le programme peut servir de squelette pour parcourir cette arborescence, pour y faire ce quel l'on veut ... ;**************************************************************************** ;§/menu/programme de test pour visualiser l'arborescence des menus telle qu'elle est parcourue/none (defun c:test_menu_tree (/ ok i j acadObject AcadMenuGroup NbMenuGroup currMenuGroup currMenuGroupMenus scMenu ) (vl-Load-Com) (setq acadObject (vlax-get-acad-object)) (setq MenuGroups (vla-get-MenuGroups acadObject)) (prompt "\nNombre de menugroup ") (print (setq NbMenuGroup (vlax-get-property MenuGroups 'Count)) ) (setq j 0) (while (< j NbMenuGroup) (setq MenuGroupe (vlax-invoke-method MenuGroups 'Item j)) (print (vlax-get-property MenuGroupe 'name)) (setq MenuCollection (vla-get-Menus MenuGroupe)) (prompt "\n Nombre de sous Menu : ") (princ (setq nbScmenu (vlax-get-property MenuCollection 'Count)) ) ;;parcours les scmenus (setq i 0) (while (< i nbScmenu) (setq scMenu (vlax-invoke-method MenuCollection 'Item i)) (setq tmp scmenu) (if (vlax-property-available-p scMenu 'name) (prompt (strcat "\n " (vlax-get-property scMenu 'name)) ) ) (if (vlax-property-available-p scMenu 'label) (prompt (strcat "\n " (vlax-get-property scMenu 'label)) ) ) (prompt "\n Nombre de Menuitems ") (princ (setq NbMenuitems (vla-get-count scMenu))) ;;parcours les menuitems (setq k 0) (while (< k NbMenuitems) (setq MenuItem (vlax-invoke-method scMenu 'Item k)) (if (vlax-property-available-p MenuItem 'name) (prompt (strcat "\n " (vlax-get-property MenuItem 'name)) ) ) (if (vlax-property-available-p MenuItem 'label) (prompt (strcat "\n " (vlax-get-property MenuItem 'label) ) ) ) (setq k (+ 1 k)) ) (setq i (+ 1 i)) ) (setq j (+ 1 j)) ) )
  24. GEGEMATIC

    Variant et Safearray

    Salut, Pour compléter ces outils, ci dessous une fonction vlax_list->Safearray universelle, qui serait le mirroir de la fonction vlax-safearray->list En réalité, les cas où on peut l'employer telle quelle sont rares, je ne l'utilise donc pas trop, j'utilise plus souvent des routines spécifiques comme celles que tu propose. Mais elle à l'interret de récapituler les cas possibles. ;;*************************************************************************************************** ;;§/vlax/retourne le type vb d'un element lisp /elt ;(pw_vBtype '(1 2 3)) -> saffearray (defun pw_vBtype (elt / tp) (setq tp (type elt)) (cond ((= tp 'INT) vlax-vbLong) ((= tp 'REAL) vlax-vbDouble) ((= tp 'SAFEARRAY) vlax-vbArray) ((= tp 'STR) vlax-vbString) ((= tp 'VLA-object) vlax-vbObject) (t vlax-vbVariant) ) ) ;;*************************************************************************************************** ;;§/vlax/transforme une liste en saffearay /ptsList ;;;Commande: (setq res (pw_list->safearray '( 1 2 3))) ;;;#<safearray...> ;;;Commande: (vlax-safearray->list res) ;;;(1 2 3) ;;;Commande: (setq res (pw_list->safearray '( 1 "2" 3))) ;;;#<safearray...> ;;;Commande: (vlax-safearray->list res) ;;;(#<variant 3 1> #<variant 8 2> #<variant 3 3>) ;;;Commande: (setq res (pw_list->safearray '(( 1 2 3)(2 3 4)))) ;;;#<safearray...> ;;;Commande: (vlax-safearray->list res) ;;;((1 2 3) (2 3 4)) ;;;Commande: (setq res (pw_list->safearray '(( 1.0 2.0 )( 3.0 4.0)))) ;;;#<safearray...> ;;;Commande: (vlax-safearray->list res) ;;;((1.0 2.0) (3.0 4.0)) ;;;Commande: (setq res (pw_list->safearray '(( 1.0 2.0 )( 3.0 4)))) ;;;#<safearray...> ;;;Commande: (vlax-safearray->list res) ;;;((#<variant 5 1> #<variant 5 2>) (#<variant 5 3> #<variant 3 4>)) ;;; (defun pw_list->Safearray (alist / lltyp llength) (setq alist (vl-remove-if 'null alist)) (if (vl-some 'listp alist) (progn (setq llength (mapcar '(lambda (x) (vl-catch-all-apply 'length (list x))) alist ) ) (setq long (car llength)) (if (not (vl-every '(lambda (x) (= x long)) llength)) (prompt "\nErreur dans pw_list->safearray, liste de liste de longueure variable" ) (progn (setq lltyp (mapcar 'type (pw_flatten_list alist))) (setq tp1 (car lltyp)) (if (not (vl-every '(lambda (x) (= x tp1)) lltyp)) (setq tp vlax-vbVariant) (setq tp (pw_vBtype (caar alist))) ) (vlax-safearray-fill (vlax-make-safearray tp (cons 0 (1- (length aList))) (cons 0 (1- long)) ) alist ) ;_fill ) ) ) (progn (setq lltyp (mapcar 'type alist)) (setq tp1 (car lltyp)) (if (not (vl-every '(lambda (x) (= x tp1)) lltyp)) (setq tp vlax-vbVariant) (setq tp (pw_vBtype (car alist))) ) ;;(vlax-make-variant (vlax-safearray-fill (vlax-make-safearray tp (cons 0 (1- (length aList))) ) alist ) ) ;;) ) )
  25. Oui, il y a une procédure pour les versions x64, c'est d'ailleur pourquoi j'ai fait ce billet de blog : Installation sur les plateformes x64 Pour l'instant, la procédure de lancement par la commande powerclic.exe ne marche pas avec les plateformes 64 bits : Il faut passer par une installation semi-manuelle : Sous windows, lancez PowerClicSetup.exe: Après un certains nombre de questions, il installe PowerClic dans le répertoire de votre choix puis affiche une fenêtre MsDos (noire) C'est à ce moment que l'installation automatique s'arrete: Pour poursuivre : Fermer la fenêtre MsDos Lancez Autocad. Avec autocad, ouvrez le dessin pwr_clic.dwg, dans le répertoire d'installation de PowerClic. Depuis la ligne de commande d'Autocad, tapez la commande "script" , et choisissez PowerClicSetupManuel.scr:
×
×
  • 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é