Aller au contenu

krunch

Membres
  • Compteur de contenus

    239
  • Inscription

  • Dernière visite

Tout ce qui a été posté par krunch

  1. Merci, en effet il y a un événement beginRightClick qui pourrait faire l'affaire. PS : perso j'ai souvent tendance à cliquer droit pour annuler (sans valider donc), c'est pour savoir ..
  2. Bonjour Y a t-il un moyen de différencier un clic-droit de la saisie de Enter/Escape avec par exemple getPoint (renvoient tous les deux 'nil') ? ____________________________ J'en profite pour poster un sondage ... De façon général je trouve assez pratique de pouvoir annuler une commande avec le clic-droit (c'est la cas pour la majorité des commandes qui nécessitent une sélection), même si la commande a une option par défaut (notée <O>) dans la mesure où pour valider l'option par défaut il y a déjà Espace et Enter... C'est peut-être pas très conventionnel mais il me semble que c'est plus pratique que de toujours aller chercher Escape. > Qu'en pensez vous ?
  3. C'est tout à fait ça .. Merci bien : j'avais pas pensé aux variables système, et surtout je connaissais pas cet ancien sujet très utile ... En fait y aurait de quoi faire une encyclopédie rien qu'avec tes contributions !
  4. Bonjour à tous .. Quand on crée avec une commande une entité comportant une propriété Rotation (RefBloc, Text ..) dans un SCU pivoté 2D/3D sa propriété Rotation (code de groupe 50) est mise à jour. Par exemple si on crée un TEXT avec un angle 0 dans un SCU pivoté on le récupère avec un angle calculé en fonction de l'angle 'horizontal' du SCU (et si on entre un angle quelconque cet angle est ajouté). Mais si on fait pareil avec entmake ou vla-AddXXX la propriété Rotation n'est pas mise à jour (avec entmake l'entité est alignée sur le SCG mais on peut toujours actualiser la normale), et si le SCU a un angle horizontal l'entité est de traviole .. La question est donc : comment calculer cet angle pour l'injecter dans le code 50 ? En tâtonnant je suis arrivé à la fonction suivante (à partir d'un calcul angulaire piqué chez gile) en calculant l'angle entre l'axe (Ox) du SCU et l'axe (Ox) transformé selon la normale du SCU [a] : ; the angle stored in group code 50 is measured clockwise from the X axis of the Object Coordinate System (OCS) (defun c:go (/ a B) (setq a (trans '(1 0 0) (trans '(0 0 1) 0 1 T) 1 T) b (trans '(1 0 0) '(0 0 1) 1 T) ) (angle_3pts a B) ) (defun angle_3pts (v1 v2 / v1 v2) (cond ((equal v1 v2 1e-009) (- pi (angle_3pts '(1 0 0) v1))) ; si uniquement pivoté selon (Oz) ((equal v1 (mapcar '- v2) 1e-009) 0.0) (T (- pi (* 2 (asin (/ (distance v1 v2) 2))))) ) ) ;;; ANGLE_3PTS Retourne l'angle (radians) défini par son sommet et deux points (méthode théorème de Carnot) ;;; ACOS Retourne l'arc cosinus du nombre en radians (defun ASIN (num) (if (<= -1 num 1) (atan num (sqrt (- 1 (expt num 2)))) (princ "\nErreur: L'argument pour ASIN doit être compris entre -1 et 1") ) ) Mais il semblerait qu'elle ne marche pas dans tous les cas : Il y a des seuils et des conditions dans lesquels il faut ajouter des pi et pi/2 (?) En fait je comprends pas très bien la logique de tout ça ... quelqu'un sait comment faire ?
  5. Bonjour A mon avis ce que tu cherches à faire sera assez compliqué en Lisp (en C# je ne sais pas) si le contour de la région test ou celui de l'objet à tester comporte des segments non rectilignes (arcs ou splines). Sinon, tester si un objet est contenu dans un contour polygonal ça paraît faisable : - soit avec un ssget (CP ou WP) : solution très imparfaite qui est justement en discussion ici - soit en intégrant un algo analytique : celui là devrait pouvoir faire l'affaire mais il faut le décortiquer et l'adapter ..
  6. krunch

    Importer des données SIG

    Ok j'ai pu l'ouvrir. C'est juste qu'il y a comme un hiatus avec les altis : les z sont bien en mètres alors que le plan (x,y) semble être en 10^5 mètres (pour la position par rapport à l'origine je sais pas). Merci beaucoup, je vais pouvoir bidouiller et faire mes essais avec ça.
  7. krunch

    Importer des données SIG

    Sans doute, mais j'ai posté là parce que je ne dispose pas de l'artillerie lourde (juste quelques moyens artisanaux) et je pensais que c'était jouable avec un AutoCAD 2010 et un peu de Lisp. Merci pour cet essai, maintenant je sais que AutoCAD Map (que je ne connais pas) assure tout le processus le cas échéant. Et te serait il possible de me mettre ce dwg sur wetransfer ou autre ?
  8. krunch

    Importer des données SIG

    Merci beaucoup, je t'ai envoyé le lien pour un essai .. mais sans perte de temps hein, si ça marche pas tant pis ..
  9. krunch

    Importer des données SIG

    Merci pour vos réponse, mais je n'ai toujours pas réussi :( J'ai testé Quantum GIS qui a l'air très bien mais qui refuse le SHP ("données non-valide"). Sinon je ne vois pas ogr2ogr sur la page, pas essayé les autres (qui ont plutôt l'air d'être des addons) car j'en suis au 5 ou 6è soft, en vain .. Ce qui est pénible c'est que je serais capable de récupérer les altimétries du DBF en Lisp mais AutoCad refuse aussi le SHP qui contient le semis de points 2D .. J'essaierai sur d'autres forums SIG. Merci
  10. Bonjour J'essaie d'importer des fichiers SHX issus d'un système SIG dans AutoCad 2010, avec à chaque fois un prj+shx+shp+dbf (le dbf stocke les altimétries des points). Une importation basique _LOAD renvoie une "Erreur de lecture du fichier formes" et je n'ai pas d'AutoCad MAP ou CIVIL ... Trouvé plusieurs résultats de recherches mais rien ne marche. Par exemple l'appli Import Shapes de ce site est en VB (plus supporté), ici je tombe sur des outils pour ArcView, j'ai trouvé des softs qui visualisent le fichier mais sans exporter ... Quelqu'un aurait une solution qui marche sous 2010 ?
  11. Bon, j'ai peut-être pas tout compris mais en tout cas à la place de ce dernier code tu peux écrire directement : Et aussi : "\nDonnez le point d'insertion : " (ou Spécifiez) même si ça ne gène pas l'exécution du Lisp ..
  12. En fait l'anitislash est un caractère spécial qui doit être précédé d'un antislash (donc doublé), c'est la même chose avec le guillemet qui s'écrit "\"". A part ça dans ton exemple il n'y a donc pas besoin du cond (strcat cheminint name) suffit .. et pas besoin d'antislash final il me semble.
  13. Oui tu peux entrer le chemin du bloc, notamment avec la commande _-insert (ou -inserer) et avec la méthode InsertBlock ..
  14. Less is more... Bravo quelle classe !
  15. Ok merci bien Je suis resté sur la version de gile postée ailleurs qui a l'avantage de rester en C# (pour moi c'est déjà suffisamment compliqué comme ça ..) et que je remets ci dessous. Sur mon 2010 ça marche, à la réserve près qu'un appel de c:function provoque une erreur fatale, je dois utiliser le vl-acad-defun. J'ai vu que ta méthode permets d'éviter le vl-acad-defun, mais sinon pas d'inconvénient a priori ? using System; using System.Runtime.InteropServices; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Runtime; namespace InvokeLispSample { public class Class1 { [system.Security.SuppressUnmanagedCodeSecurity] [DllImport("acad.exe", EntryPoint = "acedInvoke", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)] extern static private int acedInvoke(IntPtr args, out IntPtr result); /// 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. public static ResultBuffer InvokeLisp(ResultBuffer args) { IntPtr ip = IntPtr.Zero; int status = acedInvoke(args.UnmanagedObject, out ip); if (status == (int)PromptStatus.OK && ip != IntPtr.Zero) return ResultBuffer.Create(ip, true); return null; } // Test avec : // (defun foo (l) (mapcar 'strcase l)) // (vl-acad-defun 'foo) [CommandMethod("Test")] public void Test() { Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; // Argument pour InvokeLisp ResultBuffer resbuf = new ResultBuffer(); // Nom de la fonction LISP : foo resbuf.Add(new TypedValue((int)LispDataType.Text, "foo")); // Argument de la fonction LISP : ("test" "invoke" "lisp") resbuf.Add(new TypedValue((int)LispDataType.ListBegin)); resbuf.Add(new TypedValue((int)LispDataType.Text, "test")); resbuf.Add(new TypedValue((int)LispDataType.Text, "invoke")); resbuf.Add(new TypedValue((int)LispDataType.Text, "lisp")); resbuf.Add(new TypedValue((int)LispDataType.ListEnd)); // Résultat de l'évaluation de (foo '("test" "invoke" "lisp")) ResultBuffer result = InvokeLisp(resbuf); foreach (TypedValue tv in result) { ed.WriteMessage(tv.Value + " "); } } } }
  16. Ça y est .. Dans l'exemple ci-dessus il manquait juste l'argument : D'autre part si je définis la fonction foo avec c: j'ai une erreur fatale (avec 2010), il faut définir la fonction normalement + vl-acad-defun ..
  17. gile, on a répondu en même temps .. J'ai compris le rôle du ResultBuffer en entrée/sortie, y compris dans ton exemple TEST, mais appliqué tel quel j'ai pourtant une erreur 'Nombre d'arguments trop importants' ..
  18. Le 'très simplement' est décidément une notion bien relative ... Alors il y avait sans doute une bourde de ma part dans l'erreur du Netload (un "Test" doublon dans la solution d'après ce que j'ai compris) Il me semble que j'arrive maintenant à faire marcher la méthode 'InvokeLisp' de (gile) ci-dessus ou encore celle-ci, par contre tel quel il y a une erreur dans la commande de Test non ? Commande: test ; erreur: nombre d'arguments trop important -1
  19. Salut. Oui j'ai lu ce sujet, mais c'est du VB ..
  20. Bonjour Désolé de revenir sur des vieux sujets mais cette dernière méthode de (gile) m'intéresse beaucoup (j'ai besoin d'une échange avec le Lisp) et je n'arrive pas à la faire marcher, j'ai un message d'erreur de Netload que je ne sais pas interpréter ... A tout hasard j'ai remplacé les IntPtr par des Int32/64 (version 2010) mais ça ne convient pas à acedInvoke (et l'aide ne me dit pas grand chose là dessus). Sinon, est ce que cette méthode permettrait de renvoyer des objets, des listes, des listes de listes .. ?
  21. D'accord compris, merci pour tes explications. Pour en revenir à ma dernière question de base (cas d'un appel indirect par le Lisp) il ne reste donc plus qu'à déterminer la version pour faire un Netload sur la bonne .dll (hors modif majeure du .Net), avec si possible un test qui marche aussi avec les versions ultérieures à 2013.
  22. D'accord, une solution peut contenir plusieurs projets... Mais cette méthode est censée générer 1 seule .dll ou 2 ? Là je n'en ai qu'1 (dans le Debug du projet de base, pas dans celui du nouveau) mais j'ai fait les choses à moitié, je n'ai pas branché (ni téléchargé) les nouvelles références. Dernier truc : ACAD_19 est un symbole prédéfini pour la version dans ce cas ?
  23. Ok, oui c'est ce que tu as expliqué ici, donc continuité 2007-2012 (sauf pour 1 classe éventuelle) et 32-64bits. Et pour ce qui de 2013 je peux toujours installer un Framework 4, télécharger ObjectARX2013, faire un nouveau modèle .. pour générer des dll 2013... Mais en général au niveau du code est ce que les changements sont important ou c'est juste des adaptations ponctuelles sur certaines classes ? Qu'est ce qui clocherait par exemple dans un highlight ?
  24. Bonjour, c'est des questions générales et pratiques .. - Etant donné que la version de objetctARX doit correspondre au Framework, est ce que je dois avoir un ACad2013 pour faire un .dll qui marche sur ACad2013 (là j'ai un 2010) ? Si non je dois installer les objectARX et le Framework correspondant ? - Apparemment il y a des évolutions tous les 3ans .. donc il faudra faire une nouvelle dll tous les 3 ans ? - Actuellement il faut faire plusieurs .dll selon la version, ensuite comment on teste la version en Lisp pour le Netload (avec ver ?) ? Cette question est pour le cas où on mixe avec du Lisp, même si j'ai bien compris que c'était pas l'idéal ..
×
×
  • 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é