-
Compteur de contenus
17 -
Inscription
-
Dernière visite
Type de contenu
Profils
Forums
Calendrier
Blogs
Tout ce qui a été posté par JFTxJ
-
Merci didirer et Tramber, mais le problème n'est pas de trouver l'ordre, mais de la sauver sans l'aide des handles. (je doit la réappliquer dans un nouveau dessin, où les objets ont été recréé, donc avec des handles différents).
-
Je connais pas bien le LISP malheureusement..... mais merci. Le problème, c'est que quand je recré les objets dans une nouvelle session d'autoCAD, les handles changent (ou du moins, je n'ai pas controle dessus; c'est normal, puisque les handles sont valides pour la vie d'un dessin seulement). J'ai temporairement décidé de "mappé" le "drawing order" à la clef de chaque objets dans la base de donnée. Donc, je peut garder mon ordre, mais ca double presque la grosseur moyenne de mes transferts à la base de donnée.... c'est ce que je voulais évité.
-
OK. Je développe une app. qui permet de lire un dessin (les objets et toutes leurs coordonnées) et dépose ces informations dans une base de données. Par la suite, tout usagé de ce programme peut aller chercher ce dessin, le programme demandant toutes les coordonnées et recréant les objets. Ceci fonctionne à merveille. Voici le problème: Je doit respecter l'ordre original de dessinage des objets. Malheureusement, puisque les objets sont recréés dans un nouveau dessin (qui peut déjà contenir des objets), les Handles ne sont pas constants. Donc je doit trouver un mécanisme qui me permettrais de sauvegarder l'ordre de dessinage des objets sans faire référence au Handle de ces objets. N'importe quel idée serais bienvenu.. Merci
-
Désolé, mais ca ne peut pas être une question de limite. (Est-que tu valide le type d'objets? Est-ce que ca se pourrait que les rectangles ne sont pas tous des AcDbPolyline, mais des AcDb3DPolyline ou AcDbLightWeightPolyline??? ) Mais oublie ca, notre projet contiens plus de 5000 procédures variés, et la seule limite qui existe dans ce contexte serait celui du "stack-space", et en se rendant à cette limitte, une erreur est automatiquement levé. (Si tu as besoin de précision, consulte l'aide de VBA sous "Out of Stack space" erreur.) Attention : Assure toi que tu n'a AUCUN On Error Resume Next dans to code, puisque qu'ils sont très méchant dans AutoCAD/VBA. Si c'est le cas, commente les tous et essaie de régler les bugs que tu as sans ces petits "On Error Goto HELL"!!!!
-
Pas exactement: Un dictionnaire est un objet qui permet de storer n'importe quoi tout en y attachant une clef. Donc, prenons une exemple de Chaine de caractères: Des employés dans une compagnie ont chaqun un code d'employé : 1A : Mathieu 2A : Nathalie 1B : Luc 2B : Julien 3C : Palourde Storer ces informations dans une/des arrays serait un peu long et pénible à gérer. Dim EmployesNames() as String Dim EmployesCodes() as String Mais pas avec un dictionnaire: Dim DictObj as Dictionary set DictObj = new Dictionary DictObj.Add "1A", "Mathieu" DictObj.Add "2A", "Nathalie" DictObj.Add "1B", "Luc" DictObj.Add "2B", "Julien" DictObj.Add "3C", "Palourde" Après, on peu accéder le nom de l'employé directement avec son code d'employé, sans avoir à passer par deux arrays. Aussi, (1) La clef peut être de tout type de variables, et la valeur est de type Variant, dans le sence que le même dictionnaire peut contenir des valeures de types différents. Malheureusement, seul une Clef et une Valeure sont permise dans un dictionnaire. Pour "le "paramétrer" en nombres de colonnes", tu te dois de créer un objet (classe VBA) qui contiens les paramètres de l'info à storer, et puis faire de cet objet la valeur tel quel que tu rajoute au dictionnaire avec la commande Add. J'espère que ca t'aidera.
-
(Degenerate geometry) Leaders, Ellipses et Polylignes
JFTxJ a répondu à un(e) sujet de JFTxJ dans Routines VBA
Hen??? je n'ai pas compris ton dernier message... Anyway, voici une exemple du code que j'essaie d'exécuter. Les coordonnées commentés sont des coordonnées fonctionnelles, mais pas les autres..... '--------------------------------------------------------------------------------------------------------------------------- Dim LObj As AcadLeader Dim x As AcadMText Dim INSERTIONP() As Double ReDim INSERTIONP(0 To 2) Dim XYZ() As Double ReDim XYZ(0 To 17) XYZ(0) = 34489130.4553939 XYZ(1) = 50270033.9939792 XYZ(2) = 0 XYZ(3) = 42775876.0029437 XYZ(4) = 33241687.2030968 XYZ(5) = 0 XYZ(6) = 54055057.7196147 XYZ(7) = 56252966.7532379 XYZ(8) = 0 XYZ(9) = 70513455.307637 XYZ(10) = 43596762.8997782 XYZ(11) = 0 XYZ(12) = 99286878.0933764 XYZ(13) = 46128003.7601431 XYZ(14) = 0 XYZ(15) = 107918904.929098 XYZ(16) = 50730259.6253348 XYZ(17) = 0 ' XYZ(0) = 3989533.7243697 ' XYZ(1) = 62120843.0486121 ' XYZ(2) = 0# ' XYZ(3) = 54055057.7196147 ' XYZ(4) = 79149190.0636769 ' XYZ(5) = 0# ' XYZ(6) = 66945551.2196588 ' XYZ(7) = 66262873.5066305 ' XYZ(8) = 0# ' XYZ(9) = 82943574.0124316 ' XYZ(10) = 74892103.3659563 ' XYZ(11) = 0# ' XYZ(12) = 99286878.0933764 ' XYZ(13) = 64306914.7415058 ' XYZ(14) = 0# ' XYZ(15) = 118392430.562348 ' XYZ(16) = 76042667.3322542 ' XYZ(17) = 0# INSERTIONP(0) = 100 INSERTIONP(1) = 100 INSERTIONP(2) = 0 Set x = ThisDrawing.ModelSpace.AddMText(INSERTIONP, 100, "Je suis fou, ou partiellement") ThisDrawing.ModelSpace.AddPolyline XYZ Set LObj = ThisDrawing.ModelSpace.AddLeader(XYZ, x, acLineWithArrow) '--------------------------------------------------------------------------------------------------------------------------- P-être que ça pourrais t'aider à comprendre.... -
En fait, en VBA, l'objet SelectionSet peut utiliser les GroupCodes. Comme Winfield a dit, le code à utiliser est le 0. Voici une exemple qui recherche dans le dessin toutes les Layers utilisé... Dim collCurrentLayers As New Dictionary Dim LayerObj As IAcadLayer2 Dim SSet As AcadSelectionSet Dim gpCode(0) As Integer Dim dataValue(0) As Variant Dim groupCode As Variant, dataCode As Variant '-----------------------Code qui évite le problème du SelectionSet déjà existant. For Each SSet In ThisDrawing.SelectionSets If SSet.Name = "PerLayer" Then Exit For Next SSet If SSet Is Nothing Then Set SSet = ThisDrawing.SelectionSets.Add("PerLayer") End If '-----------------------Code qui évite le problème du SelectionSet déjà existant. collCurrentLayers.RemoveAll Dim x As AcadObject '-------------Building the dictionary of collCurrentLayers For Each LayerObj In ThisDrawing.Layers SSet.Clear gpCode(0) = 8 dataValue(0) = LayerObj.Name groupCode = gpCode dataCode = dataValue SSet.Select acSelectionSetAll, , , groupCode, dataCode If SSet.COUNT > 0 Then collCurrentLayers.Add LayerObj.Name, LayerObj End If Next LayerObj SSet.Delete '------------------------------------------------------ '------------Building the dictionary of StandardLayers Donc ici, la variable "gpCode(0)" devrais avoir une valeur de "0", et "dataValue(0)" devrais être le nom DXF des objects que tu cherche. Malheureusement, je crois que tu devras faire un sélection pour chaque type d'objets que tu recherche. Je crois pas que tu puisses le faire en un coup.... J'espère que ça l'aide.
-
(Degenerate geometry) Leaders, Ellipses et Polylignes
JFTxJ a répondu à un(e) sujet de JFTxJ dans Routines VBA
Merci Didier... Désolé, j'ai eu la même chose.... C'est qu'ils ne fonctionne pas avec un object "Annotés" (je sais pas c'est quoi le bon mot en Français, mais "Annotation Object"). J'ai été surpris que ca marche hier... mais d'ès que j'y met un objet annoté, j'ai le message "Not applicable", et non "Degenerate geometry". Ce dernier message m'est seulement donné lors de la création d'éllipses et c'est un problème de Radians........ (je commencerai pas sur ce sujet). Pour mon erreur, je sais que c'est probablement une erreur de logique/CAD (je connais absolument rien au dessins CAD, je ne suis que programmeur.... ;-(). Mais toutes idées serais très apprécié. J'ai essayé avec les 3 sortes d'annotation (MText, Tolerance et BlockReference), mais aucun fonctionne. Merci encore... [Edité le 12/10/2005 par JFTxJ] -
J'ai AutoCAD 2005 anglais. Je doit lire (extraire) les coordonnées d'un de ces objets, les storer pour pouvoir les recréer dans un autre dessin. Ceci fonctionne très bien. Mon problème est que lorsque je recré certains de ces objets avec des coordonnées précises, je reçois l'erreur "Degenerate geometry". Ceci arrive sur certaines combinaisons de coordonnées précises, et pas sur d'autre. Aucune particularité de ces coordonnées furent reconnus par notre administrateur CAD (à sa connaissance). Voici une exemple de ces coordonnées non fonctionnelles pour un Leader Point 1 X: 34489130.4553939 Y: 50270033.9939792 Z: 0 Point 2 X: 42775876.0029437 Y: 33241687.2030968 Z: 0 Point 3 X: 54055057.7196147 Y: 56252966.7532379 Z: 0 Point 4 X: 70513455.307637 Y: 43596762.8997782 Z: 0 Point 5 X: 99286878.0933764 Y: 46128003.7601431 Z: 0 Point 6 X: 107918904.929098 Y: 50730259.6253348 Z: 0 Si vous avez la moindre idée, j'en serais très reconnaissant.
-
Désolé de me permettre, mais..... J'ai eu à faire beaucoup de tests avec VBA+MLines. Voici mes conclusions et remarques: (AutoCAD 2005) - Peu importe le MLineType actif, la méthode de VBA ne la prend pas en considération, incluant la largeur (espacement des deux lignes). Nous avons réussit avec la méthode SendCommand, mais, toujours utilisant des données extraient d'une MLine existante, nous avons remarqué une instabilité dans les coordonnées. AutoCAD est à blamer, car la "Command line" ne supporte pas une aussi grande précision décimale que AutoCAD lui-même. Un arrondissement est fait, créant un décallage de la ligne exponentiel. En regardant la différence entre le modèle d'objet de AutoCAD 2005 et 2006, ceci semble résolu en 2006. Je recommendrai à toute personne d'éviter les MLines avec VBA et d'exécuter un "Explode" sur chaque MLine pour éliminer toutes ces erreures..... J'espère que ca te sauvera un peu de temps..... ;-)
-
Malheureusement, ces coordonnées, je les ai déjà..... Mais si tu regarde bien: ThisDrawing.ModelSpace.AddPolyfaceMesh(vertexList, [surligneur] FaceList[/surligneur]) ...ce n'est pas les vertex list que j'ai besoin, (je sais très bien que la propriété "Coordinates" existe), mais c'est la FaceList qui ne peut être extraite de l'objet. Ce que ce fichier me donne n'est simplement que la liste de tout les points, sans me dire quelles faces elles sont associés à....... Merci quand-même...... [Edité le 28/4/2005 par JFTxJ]
-
Ben..... C'est quoi que tu veux dire par "MicroStation". Oui, tu peux contrôler (créer, détruire, ...) tous les menus ou toolbars de AutoCAD. Si c'est de ça que tuparles, pas de probleme, je te donnerai ce que tuas besoin.
-
C'est de valeure que ca serve à absolument rien autre que de mimiquer du spam que de nous faire perdre du temps......... Je me tords de rire.... entouca je pense......
-
Merci mais......... Je doit malheureusement rester dans VBA. Parcontre, (je ne crois pas que c'est possible), existe-t-il un équivalent de SendCommand, mais me permettant d'exécuter du code LISP à partir de VBA. (Je pourrais aussi écrire cette chaîne dans un fichier texte, mais est-ce que je peut le faire exécuter...) Merci...
-
Je n'ai pas de réponse évidente. (Ceci n'est que mon opinion) D'après moi, c'est une question de hyérarchie d'objet lorsque qu'ils ont été designé avec C++ (ObjectARX) et le fait que certaines de ces objets requiert seulement une valeure en X et en Y, et pas de Z, qui est beaucoup plus facile à gérer avec un Variant qu'avec un "Property Get": (Équivalent de ce que je veut dire en VB NET) (pour le Cercle) Public Property Overrides Center() as Variant 'ReDim Center(0 to 2) (pour le PViewport) Public Property Overrides SnapBasePoint() as Variant 'ReDim SnapBasePoint(0 to 1) Garde en tête que la source d'AutoCAD est en C++ et que, comme tu as surement déjà remarqué, le modèle VBA est incomplet et semble avoir été fait "à la presse". Cette particularité (l'utilisation de variants variant :exclam: ) me saute au visage comme étant un grand "time-saver"........ simplement....
-
J'ai besoin d'obtenir les faces d'un PolyfaceMesh existant dans le dessin. Le modèle VBA de AutoCAD contiens la propriété (caché) "Faces" existe dans l'objet AcadPolyfaceMesh (mFaces = PolyfaceMeshObj.Faces), mais je reçoit toujours une erreur "Invalid use of property" (mFaces est Variant et même un Debug.Print PolyfaceMeshObj.Faces, avec ou sans un (0), me lance la même erreur). En plus, la propriété n'est pas documenter dans le fichier d'aide. :mad: Je voulais savoir comment (autre qu'avec cette propriété qui semble défectueuse) est-ce que je pourrais extraire la liste des points formant les faces (donc la séquence des "Coordinates" qui est nécessaire dans le object.AddPolyfaceMesh(VerticesList, FaceList) ). Merci beaucoup. :cool:
-
Si ton mur est toujours pareil, la solution parfaite est simplement d'en faire un Bloque... Sinon, commence par peser Alt+F11 dans AutoCAD. Là, il te faut un background en programmaton. Mais, si tu lis assez, tu peux apprendre à le faire. Dans autoCAD (pas VBA), va dans le menu Help et choisit "Developper's documentation", et commence à lire. Je pourrait te doner le code, mais ca ne sert à rien tant que tu ne sais pas ce que tu fais en VBA. Guides: méthode AddMLine esseye ca... (moi je fonctionne en Anglais, mais VBA devrais être le même) Dim MLineObject as AcadaMLine Set MLineObject = ThisDrawing.ModelSpace.AddMLine(...........) MLineObject.TrueColor = ...... É voilà comment créer une MLine mais.......... malheureusement, AutoCAD 2005 ne te laisse pas, en aucun temps DANS VBA, d'assigner la distance entre les deux lignes, ni la justification du text... et quelques autres propriétés. Tout est régler dans le modèle de 2006. Désolé, mais la seule solution est d'utiliser la méthode SendCommand, qui permet d'automatiser des comandes que tu pourrais entrer manuellement dans la fenêtre de commande de AutoCAD (commande MLINE).
