Aller au contenu

Messages recommandés

Posté(e)

Bonjour

 

Je cherche à intervenir sur les propriétés de calques par Viewport.

Après pas mal de recherches j'ai trouvé (chez Lee Mac) de quoi lire ces propriétés mais apparemment impossible de les écrire (lisp en dessous)

 

Ensuite j'ai trouvé ça : un dll qui fabrique une fonction .. Donc ça se confirme, c'est loin d'être simple...

 

Pour modifier d'autres propriétés (que couleur et linetype) il faudrait ouvrir le code de Changevpsettings pour refaire un dll à partir du .vb ?.. C'est comme du VBA ?.. Pensez vous que ce soit une solution ?... Ou vaut-il mieux penser à autre chose :blink:

 

Merci d'avance

 

 

 

(GetXrecord "0") renvoie props d'épaisseurs de VP du calque0

vla-setXRecordData provoque une erreur

(defun GetXrecord (layer / xrec)
 (vl-load-com)
 (setq	layer (vla-item (vla-get-Layers (vla-get-ActiveDocument (vlax-get-acad-object))) layer))
 (if (eq :vlax-true (vla-get-HasExtensionDictionary layer))
     (progn
(setq xrec (vla-item (vla-getExtensionDictionary layer) "ADSK_XREC_LAYER_LINEWT_OVR"))
(vla-getXRecordData xrec 'cod 'val)
       (print (vlax-safearray->list cod))(print (vlax-safearray->list val))(print)

;; (vla-setXRecordData xrec (vlax-make-variant cod) (vlax-make-variant val)) ; !! ERR!!

;; (LM:Variants->DXF cod val)
     )
 )
)

Posté(e)

Salut,

 

Non ce n'est pas comme du VBA (sinon on pourrait aussi le faire directement en LISP).

Les propriétés de calque modifiables par fenêtre sont (en .NET) :

  • la couleur
  • le type de ligne
  • l'épaisseur de ligne
  • le style de tracé

Si j'ai un peu de temps, j'essayerais de faire quelque chose.

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

Posté(e)

Salut,

 

J'ai essayé quelque chose.

On trouveras dans LispVpLayer.zip une DLL et un fichier d'aide CHM pour cinq nouvelles fonctions LISP définies en NET :

  • gc-VpFreeze : geler le ou les calque(s) dans la fenêtre.
  • gc-VpThaw : dégeler le ou les calque(s) dans la fenêtre.
  • gc-ThawAll : dégeler tous les calque(s) dans la fenêtre.
  • gc-VpLayerOverride : modifier les propriétés du calque (couleur, type de ligne, épaisseur de ligne, style de tracé) dans la fenêtre
  • gc-VpLayerRemoveAll : supprimer toutes les propriétés forcées pour le calque dans la fenêtre

 

PS: une régénération est nécessaire après l'utilisation de gc-VpLayerOverride et gc-VpLayerRemoveAll.

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

Posté(e)

Bonsoir,

 

(gile) c’est très intéressant de voir que tu peux étendre les fonctionnalités d’AutoLISP en définissant de nouvelles fonctions au moyen de .net.

 

Pour ma culture personnelle j’aurais une ou deux petites questions qui me viennent rapidement à l’esprit, en point .net, tu sais définir des fonctions avec un nombre d’arguments variables et dans la même veine des fonctions à argument optionnel.

 

Je serais également curieux de savoir avec quoi tu créer tes fichiers d’aide CHM.

A+ et merci,

Apprendre => Prendre => Rendre

Posté(e)
c’est très intéressant de voir que tu peux étendre les fonctionnalités d’AutoLISP en définissant de nouvelles fonctions au moyen de .net.

Oui, j'en avais déjà fait quelques unes, je vais essayer de les rassembler.

 

Pour ma culture personnelle j’aurais une ou deux petites questions qui me viennent rapidement à l’esprit, en point .net, tu sais définir des fonctions avec un nombre d’arguments variables et dans la même veine des fonctions à argument optionnel.

En fait la méthode qui définit la fonction LISP n'a qu'un seul argument obligatoire de type ResultBuffer, il s'agit d'une collection de TypedValue qui peut donc en contenir zéro, une ou plusieurs "valeurs typées".

On est donc dans une situation similaire à un defun où l'argument serait une liste contenant les paramètres.

Dans ce cas, la majeure partie du code consiste souvent à contrôler le nombre d'arguments, et leur validité (type, valeur).

 

Je serais également curieux de savoir avec quoi tu créer tes fichiers d’aide CHM.

Les fichiers CHM sont issus de la compilation d'un ou plusieurs fichiers HTML. Il faut donc d'abord faire une page HTML pour chaque page du fichier d'aide final. Il existe des éditeurs HTML "WYSIWYG" (what you see is what you get) gratuits comme KompoZer.

La compilation en chm se fait ensuite avec HTML Help Workshop, gratuit aussi.

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

Posté(e)

Bravo, c'est carrément impressionant ! Et merci aussi pour les liens.

 

Du coup j'ai testé celle qui m'intéresse ..

 

J'ai une erreurs si j'essaie de modifier le style de tracé (idem avec un style de tracé de table attachée à la présentation) :

(gc-vplayeroverride (car (entsel)) "0" 40 nil 35 "Normal")
..
Autodesk.AutoCAD.Runtime.Exception: eNotApplicable
  à Autodesk.AutoCAD.Runtime.Interop.ThrowExceptionForErrorStatus(Int32 
errorStatus)
  à ...

 

Et une autre erreur si j'essaie la même ligne dans un dessin en ctb (manqerait un test ctb/stb) :

Erreur: type d'argument incorrect: stringp Normal

 

Sinon il y a une parenthèse en trop au milieu du code d'exemple de l'aide : (car (entsel)))

 

Merci encore

Posté(e)

Merci pour le retour, il y avait effectivement une erreur avec les styles de tracé. C'est réparé (téléchargement mis à jour).

J'ai aussi rajouté un test sur PSTYLEMODE au cas où une valeur serait spécifié dans un dessin en CTB.

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

Posté(e)

En effet plus d'erreur, par contre toujours sur les styles nommés..

 

En mode CTB :

(gc-vplayeroverride (car (entsel)) "0" 40 nil 35 "Normal")

il semble que la couleur du calque soit répliquée dans le style (> "Color_40") même désactivé (par défaut j'ai "Color_7"). En CTB il faudrait plutôt que l'argument style soit ignoré ?

 

En mode STB (présentation) je sélectionne acad.stb dans la fenêtre Propriétés puis :

(gc-vplayeroverride (car (entsel)) "0" 40 nil 35 "Style_1")

> Erreur: style de tracé incorrect

 

Le style en argument doit être "chargé" ou présent dans la liste déroulante des styles de tracés, sinon j'ai cette erreur. Pour ça il faut affecter "Style_1" au moins 1 fois à un objet quelconque ?

Je ne sais pas si j'ai raté un truc là dessus ...

 

 

Un dernier point : je pensais la mettre dans une boucle (calques), et dans ce cas il faudrait pouvoir faire le Regen à la fin (donc soit une version sans Regen soit selon argument supplémentaire).

Posté(e)
En CTB il faudrait plutôt que l'argument style soit ignoré ?

C'est le cas.

 

Le style en argument doit être "chargé"

Oui, de même pour les types de ligne.

 

Un dernier point : je pensais la mettre dans une boucle (calques), et dans ce cas il faudrait pouvoir faire le Regen à la fin (donc soit une version sans Regen soit selon argument supplémentaire).

J'ai modifié le code pour éviter qu'AutoCAD ne régénère la présentation.

 

 

PS : J'ai un peu essayé hier un nouvel éditeur HTML "WYSIWYG" gratuit plus "moderne que KompoZer : BlueGriffon.

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

Posté(e)

C'est le cas.

Oui ok, en CTB le fait qu'il écrive la couleur dans le style semble un comportement normal

 

 

Oui, de même pour les types de ligne.

J'ai fini par trouver un truc...

Les styles de tracés ne sont pas explicitement "chargés" par une commande, par contre on peut modifier CPLOTSTYLE avec le nouveau style puis remettre le précédent, ça a l'air de marcher (il y a peut être + simple ?) ...

 

(setq tmp (getvar "CPLOTSTYLE"))
(setq new "Style_1") ; le style doit être présent dans la table affectée à la présentation
(setvar "CPLOTSTYLE" new)
(setvar "CPLOTSTYLE" tmp)
(gc-vplayeroverride (car (entsel)) "0" nil nil nil new)

 

J'ai modifié le code pour éviter qu'AutoCAD ne régénère la présentation.

Super, et encore merci pour ce boulot

 

 

Par contre j'ai un problème sur une autre config. dont la particularité est d'aller chercher les fichiers (lisp et autres) sur le réseau : si je charge le dll enregistré en local (NETLOAD) ça marche, mais si je charge le même dll depuis un lecteur réseau j'ai une erreur (message interminable ci-dessous).

Le chargement d'un dll ne se fait pas de la même fonction selon l'emplacement ?

 

Commande: (gc-vplayeroverride (car (entsel)) "0" 40)

Choix de l'objet: System.Security.SecurityException: Échec de la demande 
d'autorisation de type 'System.Security.Permissions.FileIOPermission, mscorlib, 
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.
  à System.Security.CodeAccessSecurityEngine.Check(Object demand, 
StackCrawlMark& stackMark, Boolean isPermSet)
  à System.Security.CodeAccessPermission.Demand()
  à System.Reflection.Assembly.VerifyCodeBaseDiscovery(String codeBase)
  à System.Reflection.Assembly.GetName(Boolean copiedName)
  à System.Reflection.Assembly.GetName()
  à Autodesk.AutoCAD.ApplicationServices.Application.get_Version()
  à LispVpLayer.VpLayer.VpLayerOverride(ResultBuffer resbuf)
  à Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorker(MethodInfo mi, Object 
commandObject, Boolean bLispFunction)
  à 
Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorkerWithExceptionFilter(MethodInfo
mi, Object commandObject, Boolean bLispFunction)
  à Autodesk.AutoCAD.Runtime.PerDocumentCommandClass.Invoke(MethodInfo mi, 
Boolean bLispFunction)
  à Autodesk.AutoCAD.Runtime.CommandClass.CommandThunk.InvokeLisp()
L'action qui a échoué était :
Demand
Le type de la première autorisation qui a échoué était :
System.Security.Permissions.FileIOPermission
La première autorisation qui a échoué était :
<IPermission class="System.Security.Permissions.FileIOPermission, mscorlib, 
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
version="1"
PathDiscovery="C:\Program Files\AutoCAD 2010\acmgd.DLL"/>

La demande était pour :
<IPermission class="System.Security.Permissions.FileIOPermission, mscorlib, 
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
version="1"
PathDiscovery="C:\Program Files\AutoCAD 2010\acmgd.DLL"/>

Le jeu autorisé de l'assembly défaillant était :
<PermissionSet class="System.Security.PermissionSet"
version="1">
<IPermission class="System.Security.Permissions.FileDialogPermission, mscorlib, 
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
version="1"
Access="Open"/>
<IPermission class="System.Security.Permissions.IsolatedStorageFilePermission, 
mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
version="1"
Allowed="ApplicationIsolationByUser"
UserQuota="512000"/>
<IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, 
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
version="1"
Flags="Execution"/>
<IPermission class="System.Security.Permissions.UIPermission, mscorlib, 
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
version="1"
Window="SafeTopLevelWindows"
Clipboard="OwnClipboard"/>
<IPermission class="System.Security.Permissions.UrlIdentityPermission, 
mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
version="1"
Url="file:///X:/ACad support/LISP autoload/LispVpLayer.dll"/>
<IPermission class="System.Security.Permissions.ZoneIdentityPermission, 
mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
version="1"
Zone="Internet"/>
<IPermission class="System.Drawing.Printing.PrintingPermission, System.Drawing, 
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
version="1"
Level="SafePrinting"/>
</PermissionSet>

L'assembly ou le AppDomain qui a échoué était :
LispVpLayer, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
La méthode qui a causé l'échec était :
Autodesk.AutoCAD.DatabaseServices.TypedValue 
VpLayerOverride(Autodesk.AutoCAD.DatabaseServices.ResultBuffer)
La zone de l'assembly qui a échoué était :
Internet
L'URL de l'assembly qui a échoué était :
file:///X:/ACad support/LISP autoload/LispVpLayer.dll; erreur: Demande ADS 
erronée

Posté(e)

Salut, merci pour cette info.

 

Pour le moment j'ai essayé la manip telle quel mais j'ai une erreur : 'caspol.exe' n'est pas reconnu comme une commande interne ..

Il s'agit d'un système XP et non pas NT.. je chercherai par la suite, referai un message si je trouve.

Posté(e)

Bonjour (gile)

 

Encore un dernier détail : avec gc-VpLayerOverride il faudrait pouvoir spécifier la couleur par une paire pour les RVB RAL ... Voir la commande layerstate-addlayers qui utilise ces paramètres ..

Posté(e)

Si j'ai le temps...

C'est plus compliqué, ça demande au programme d'accepter plusieurs types d'arguments : entier pour couleur de l'index, liste de 3 entiers pour RVB, chaîne pour carnet de couleur.

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

Posté(e)

Bonjour (gile)

 

Chez moi (windows 7) ta dernière version (uniquement) du fichier d'aide n'est pas lu correctement : j'ai une page "Navigation vers la page Web annulée" mauvaise adresse apparemment, même quand je clique sur les rubriques.

 

 

Autre question : où sont sockées les propriétés gel/degel des calques dans la fenêtre (gérées par gc-vpthaw/gp-vpfreeze), je n'arrive pas à les trouver pour les lire... Elles ne sont pas dans les overrides des calques ni dans l'objet fenêtre ?

 

Merci d'avance

Posté(e)

Salut,

 

Chez toi, tu as probablement installé le Framework .NET 4.0 (automatique avec A 2012) qui est très pointilleux en ce qui concerne les fichiers issu du Web.

Voir ici.

 

Les calques gelés dans la fenêtre sont stockés dans les Xdata de la fenêtre (non modifiable en LISP).

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

Posté(e)

Salut

 

Chez toi, tu as probablement installé le Framework .NET 4.0...

Je parlais du fichier d'aide .chm ! qui marchait dans la version précédente .. (mais je garde ce lien car pb avec ton dll ailleurs en réseau)

 

Les calques gelés dans la fenêtre sont stockés dans les Xdata de la fenêtre (non modifiable en LISP).

Merci bien je vais chercher ça

Posté(e)
Je parlais du fichier d'aide .chm ! qui marchait dans la version précédente

Oui, j'avais bien lu, et la réponse que j'ai donnée (réponse #20) n'est pas liée au type de fichier (extension) mais à sa provenance (ordinateur extérieur ou Web).

 

mais je garde ce lien car pb avec ton dll ailleurs en réseau

Pour les problèmes de chargement de DLL depuis un serveur, ce n'est pas le dernier lien, mais celui donné réponse #12 qui pourrait être utile.

 

Il semblerait que tu ne lises pas, ou pas très attentivement, les sujets dont je donne les liens...

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

Posté(e)

Ok, au temps pour moi car en effet j'ai interprété : j'ai cru que ton lien (Propriétés-Débloquer) concernait uniquement les .dll, et surtout cette manip n'était pas utile dans la version précédente du .chm .. J'ai débloqué le chm et ça marche.

 

 

Si tu veux bien j'aurais une (dernière) question sur le codage des couleurs.

Avec les overrides on obtient uniquement le code 420 (cf cette discussion). Or avec cet entier on obtient le code RVB, et assez facilement le code ACI (si couleur ACI), mais peut-on en déduire le bookname le cas échéant ?

Posté(e)

Bonjour (gile)

 

Je reviens à nouveau pour un problème avec gc-vplayeroverride, cette fois ci utilisée depuis un contexte particulier qui est celui de OpenDCL (une image ici).

 

Le problème est qu'elle renvoie souvent une erreur eLockViolation, la description et peut être la solution sont ici ..

 

 

 

Au passage je recommande vivement OpenDCL à tous ceux qui veulent fabriquer des interfaces évoluées (niveau VB) tout en restant en Lisp, c'est un très bon outil.

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é