Overblog
Suivre ce blog Administration + Créer mon blog
16 juillet 2014 3 16 /07 /juillet /2014 13:00
Utiliser le format DWFx pour partager ses données

 

Pourquoi utiliser le DWF

Si le format PDF reste la star du partage de plans, le dwf a des avantages par rapport au PDF :

  • Conservation des hyperliens
  • Intégration des données d’objet (Voir cet excellent tuto)
  • Précision lors du zoom rapproché
Pourquoi il vaut encore mieux utiliser le DWFx

Le x de DWFx veut dire « XML », c’est du DWF en langage XML compatible avec le format XPS de Microsoft

Par rapport au DWF, il a les avantages suivants :

  • Visualisation possible avec MS Internet Explorer en natif, (Sans calques, sans hyperliens, sans D.O,  installé par défaut avec Windows)*
  • Visualisation possible avec Ms Xps Viewer (Sans calques, sans hyperliens, sans D.O,  installé par défaut avec Windows)

* Attention, l'installation de DesignreView ajoute un plug-in pour IE. Des lors, sous  MS Internet Explorer, la lecture ressemble à celle de designReview : Hyperliens, D.O, mais sans  calques.

Problématiques

Convaincu de ces qualités, vous décidez de passer au DWFx : Très bien, mais il reste quelques problèmes à creuser:

La pérennité

Autocad 2014 et 2015  ne sont pas accompagnés de DesignReview 2014 ou 2015, on peut dès lors se poser la question de la pérennité de l’application. Vous trouverez des éléments rassurants sur ce blog Autodesk

Le lecteur

Si vous avez 100% de chances qu’Acrobat Reader soit installé sur le poste de votre destinataire, il y peu de chance qu’il dispose de designReview

On l’a vu, on peut utiliser internet explorer, mais pour avoir toutes les fonctionnalités, il vaut mieux avoir designReview

Donc il faudra que votre utilisateur l’installe. Tout du moins qu’il arrive à l’installer, et encore, il faudra qu’il installe la bonne version …

La bonne version

Selon la gestion des hyperliens  que vous aurez choisi, toutes les versions  de designreview ne conviendront pas

Installer le lecteur

Il n’est pas facile de trouver un exécutable « standalone » que vous pouvez placer sur votre cédé ou votre DVD. Fournir un lien de téléchargement comme celui-ci ne sera pas très productif, car il y  beaucoup de chances que le poste cible manque de librairies comme Net 4.0 ou 4.5 etc…

Utiliser un « bundle » Autodesk :

Deploy Autodesk Design Review 2013

Exclusivement en version 2013. On peut également arriver à cette page en faisant un drag'n drop d'un fichier DWF dans IE : IE propose une recherche d'application qui vous mènera au même endroit.

Créer  une  répartition

Créer une répartition, ça veut dire en langage Autodesk, créer un exécutable qui installera en posant le minimum de questions les logiciels que vous avez choisis lors de la création de la répartition.

Prenez votre DVD d’Autocad 2013, et au lieu d’installer, choisissez « créer une répartition », sélectionnez seulement DesignReview, puis sélectionnez un répertoire vierge, genre «  InstallDesignreview2013 »

Laissez le mode silencieux, avec la 2013, tout s’installe parfaitement.

Pour installer une répartition 2012, il vous faudra certainement bidouiller le fichier ini avec ce genre d’astuce

Utiliser mes package 2012

Voici plusieurs liens pour installer designreview2012, il faut parfois en essayer plusieurs avant que ça fonctionne.

www.g-eaux.com/download/DesignReview2012/SetupDesignReview2012.msi.zip

www.g-eaux.com/download/DesignReview2012/SetupDesignReview2012+TrueView_bundle_fra.exe

www.g-eaux.com/download/DesignReview2012/DesignReview2012x64.zip

www.g-eaux.com/download/DesignReview2012/DesignReview2012x32.zip

Les hyperliens

J’ai parlé de la conservation des hyperliens. Là encore, c’est un vrai sujet …

Relatif  ou absolu ?

Sous Autocad, la bonne gestion est de ne mettre qu’un chemin relatif, et d’utiliser la variable « Hyperlinkbase »

Designreview n’a pas d’équivalent à Hyperlinkbase, il vous faudra choisir entre un chemin relatif, le DWF maitre étant à la racine de votre arborescence, et un chemin complet. Ce sont les deux seules options.

Le problème du chemin

Sous la 2013, vous allez avoir une désagréable surprise :

Le chemin du lien est la concaténation du chemin du dwfx complet + du lien relatif

Chemin relatif :

.\Mesfiches\Mafiche1.pdf

Chemin du dwf :

C:\MesDwf\MonDwfaMoi.Dwx

Hyperliens :

C:\MesDwf\MonDwfaMoi.Dwx.\Mesfiches\Mafiche1.pdf

Ça ne marche pas !

Moralité, il vaut mieux utiliser la version 2012, c’est pourquoi je ne propose que des packages 2012

Le problème de l’ouverture interne ou externe

Un autre problème va certainement se poser : si les liens pointent vers des fichiers pdf, le lien sera obligatoirement ouvert  à l’extérieur de designReview, mais par contre si c’est vers un autre fichier dwf, il s’ouvrira dans la même fenêtre (Designreview 2012) ou dans une autre (Designreview 2013), bien que cette version ait une case à cocher pour cette préférence dans la  fenêtre options.

Les données d’objet

C’est une des géniales possibilités du format DWFx, mais là encore, il y des choses à savoir :

Si vous avez suivi le tuto de Patrice, vous savez faire, mais il y a encore une subtilité :

La différence entre imprimer et  publier

Même si vous ne voulez imprimer qu’un onglet, utilisez « publier », car l’option « données de propriétés  d’objet » n’existe qu’avec publier. Si vous imprimez, vous ne les aurez pas …

G-EAUX

Partager cet article
Repost0
12 juin 2014 4 12 /06 /juin /2014 09:40

Dans l’article précédent j’expliquais comment lire et écrire des variables dans des fichiers msXml.

Une des applications concrètes de cette technique est une aide à la migration d’une version d’Autocad à l’autre.

Vous me direz : il y a déjà l’utilitaire « Migrer les paramètres personnalisés » d’Autodesk ?

Personnellement, je ne sais pas trop ce qu’il migre, je n’en ai jamais été satisfait.

Ce dont j’ai le plus besoin, moi, c’est le chargement de certains menus, et l’ajout de certains répertoires dans ACADSUPPORTPATH.

Prérequis

Avoir installé PowerClic sur les deux Autocad : par exemple Autocad 2012 et Autocad 2015

Pour Installer PowerClic, voir cet article : PowerClic 7.23 pour Autocad 2015

Méthode
  1. Depuis le vieil Autocad, on écrit la liste de nos menus et de nos acadsupportPath dans un fichier de type classeur Excel xml
  2. Sous Excel on édite le résultat, en commentant les menus et les répertoires qui sont propres à la version d’Autocad
  3. Dans le nouvel Autocad, on ajoute les acadsupportPath et les menu en utilisant notre classeur excel

 

Concrêtement

Dans le 1er Autocad (2012 pour mon exemple)

Il suffit de lancer la commande : ECRITPROFILEG-EAUX

Excel va s’ouvrir et afficher un fichier de ce type :

 

 

Aide à la migration vers Autocad 2015 avec PowerClic

Il contient deux sections :

[ACADSUPPORTPATH] et [MENUGROUPS]

Dans la section ACADSUPPORTPATH, commentez toutes les lignes qui ne sont pas votre personnalisation.

Faites la même chose dans la section MENUGROUPS, commentez toutes les lignes qui ne sont pas votre personnalisation, surtout les menus généraux comme acad.

Dans le 2eme Autocad (2015 pour mon exemple)

Lancez la commande CHARGEPROFILEG-EAUX

Choisissez le fichier xml précédent, les lignes non commentées sont ajoutées à la variable ACADSUPPORTPATH, et les menus partiels sont chargés.

g-eaux

Partager cet article
Repost0
28 avril 2014 1 28 /04 /avril /2014 12:47

Pour la lecture et l’écriture de données vers un tableur, j’ai choisis le format très mal connu msExcel2003.Xml.

Il a pour moi l’avantage d’être non compressé, et d’être éditable avec n’importe quel éditeur de texte.

Il est également compatible avec oOo.

Dans un article précédent, lecture-de-fichiers-xml-en-lisp, j’ai fournis les sources du kit nécessaire à leur lecture.

 

Ecriture d'une valeur liste

PowerClic peut écrire des variables dans ces fichiers xml, et lancer automatiquement Excel ou oOo si ils sont disponibles.

Le format choisi est une espèce de fichier ini dans un tableur. Le nom de la variable est entre crochet, et les valeurs suivent jusqu'à la section (variable) suivante.

Un ; en début de ligne est interprété comme un commentaire

Un petit exemple :

(setq maliste '((1 2 3)("a" "b" "c")))

((1 2 3) ("a" "b" "c"))

Commande: ECRITXML

Nom de la variable à écrire ?<> :maliste

Voilà le résultat :

 

On remarque que le fichier xml contient un formatage conditionnel qui en facilite grandement la lecture et le commentaire.

 

Lecture du résultat :

Commande: (setq maliste nil)

nil

Commande: CHARGEXML

"maliste" MALISTE,

"maliste"

Onglet ignoré par pw_charger_table_xml car ne contient pas de table

Les tables ont été placées dans les variables :

Commande:

Commande: !maliste

((1 2 3) ("a" "b" "c"))

Comprendre les messages de chargexml :

Pour créer un exemple de table, j’ai placé les explications dans mon fichier xlm, dans un onglet #matable

 

 

En fait, chargexml lit les fichier xml une fois sous forme de fichier ini, et un fois sous forme de table

Les tables ont un nom d’onglet commençant par #. Les têtes de colonne seront des clef d’association.

Maintenant, relançons la commande chargexml sur ce fichier :

Commande: CHARGEXML

"maliste" MALISTE,

"#matable"

Onglet ignoré par pw_charger_xml car contient une table

"maliste"

Onglet ignoré par pw_charger_table_xml car ne contient pas de table

"#matable"

Les tables ont été placées dans les variables :

#matable

Commande: !#matable

((("Message" "Commande: CHARGEXML") ("description")) (("Message" "\"maliste\"

MALISTE,") ("description" "\"maliste\" = nom de l'onglet, MALISTE = nom de la

variable")) (("Message" "\"maliste\"") ("description" "maliste = nom de

l'onglet")) (("Message" "Onglet ignoré par pw_charger_table_xml car ne contient

pas de table") ("description")) (("Message" "Les tables ont été placées dans

les variables :") ("description" "ça reste vide, puisqu'il n'y avait pas de

table")))

 

Explication des messages de chargexml :

;;lecture façon ini

"maliste" MALISTE,

"maliste" = nom de l'onglet, MALISTE = nom de la variable

"#matable"

Onglet ignoré par pw_charger_xml car contient une table

;;lecture façon table

"maliste" MALISTE,

Onglet ignoré par pw_charger_table_xml car ne contient pas de table

"#matable"

"#matable" = nom de l'onglet

Les tables ont été placées dans les variables :

#matable

 

Conclusion

Les fonctions d’écritures se limitent au format ini.

Une table est sensée être crée sous excel ou oOo

Les tables sont une solution pour lire des liste d’association.

 

Liste des commandes xml :

C:CHARGETABLEXML Chargement à partir d'un fichier xml d'une table unique par onglet

C:CHARGEXML Chargement à partir d'un fichier xml de liste de valeurs et de tables

C:ECRITXML appel principal pour écrire une variable dans un fichier Ms XML spécifié par l'utilisateur

C:FREEXML libère le fichier xml après une erreur

C:XMLEXPLORE charge un fichier xml dans le but de l'explorer et d'afficher sa structure à l'écran

g-eaux

 

 

Partager cet article
Repost0
7 avril 2014 1 07 /04 /avril /2014 16:25

Vous trouverez sur le site de PowerClic, dans la page téléchargements, une nouvelle mouture de PowerClic.

On passe ainsi de la 7.21 à la 7.23 ... donc pas de révolutions, mais quelques améliorations notables :

Support des versions 2014 et 2015 d'Autocad :

- Changement du mode de chargement automatique

- Support de la politique de sécurité "Trustedpaths"

Le bug gelant la fenêtre de dialogue principale lors de sa fermeture a été corrigé.

Ajout d'une phrase indiquant le plug-in exécuté, ainsi que le nombre d'objets sur lesquels il a fonctionné.

Compatibilité 2014 2015

PowerClic version 7.21 était déjà compatible avec la version 2014, moyennant quelques efforts pour ajouter les répertoires de PowerClic dans la zone Trustedpaths manuellement.

Je vous épargne cette dure épreuve, pour les répertoires standards de PowerClic :

Si vous créez d’autre thèmes, il faudra le faire à la mains.

Quelque explication sur la politique de sécurité d’Autodesk :

http://adndevblog.typepad.com/autocad/2013/07/all-you-need-to-know-about-autocad-secureload-au.html

Installation :

Vous trouverez toutes les informations utiles ici : Installation et mise à jour de PowerClic 7.21 pour Autocad, excepté une petite différence :

Lors de l’installation, vous aurez 2 fenêtres de sécurité : répondez Charger dans les deux cas.

Les plug-ins

La liste des plug-ins est ici sur le site de PowerClic.


G-EAUX

PowerClic 7.23 pour Autocad 2015PowerClic 7.23 pour Autocad 2015
Partager cet article
Repost0
27 février 2014 4 27 /02 /février /2014 15:26

 

Parmi les plus grosses c… que j’ai commises en 2013, passer à la nouvelle interface d’overBlog est sur le podium.

Ne pas être seul ne me consolera pas, (Voir ce type d’article : mise à jour de la nouvelle version d'overblog, un calvaire ! ou Très déçue par la nouvelle interface ) mais le résultat est que de nombreux articles ne sont tout bonnement plus accessibles, ou alors dans un ordre incompréhensible (voir la liste Top articles).

De plus les liens internes au blog ont été rompus, les liens vides, je déteste ça chez les autres, alors chez moi !

Du coup il y avait un grand besoin de :

  • Rétablir les liens
  • Rafraichir certaines informations
  • Créer un index des articles passés

C’est chose faite, bonne promenade sur le blog de G-EAUX !

 

La liste des articles par ordre de publication au 27/02/2014 :

Bienvenue sur le blog de G-Eaux

Installation et mise à jour de PowerClic pour Autocad

Imprimer des profils en travers Covadis dans un carnet de détail

Handle_explorer : Explorer votre dessin en parcourant les identifiants

Documentation sur les fonctions « acet-* » des expresstools d'Autocad

Installer les pilotes « Nvidia performance drivers » sur des applications métiers d’Autocad

Utiliser les benchmarks Cadalyst avec des versions françaises ou internationales d’Autocad

Installer les suites Autodesk building 2012

Changement de type de chemin pour les références externes

Installer les produits Autodesk 2012 sur Vista ou Seven, 32 ou 64

Numérotation de blocs sans doublons avec Powerclic

Autres fonctions de PowerTexTools

Dic_Explorer, l'explorateur de dictionnaire pour Autocad

Geler et changer la couleur des calques par pointage, une alternative aux outils Autocad

Petits outils pour utiliser Open Office avec Autocad

Object Data View (ODV), un outil de visualisation et de modification des données d’objet pour Autocad Map

Benchmark Cadalyst : Test avec Autocad 2011, 2012 et 2013, premiers résultats.

Benchmark Cadalyst : Test avec Autocad 2011, 2012 et 2013, sans aero peek

Fichiers de coloration syntaxique pour l’environnement Autocad avec Notepad++

Fichiers de coloration syntaxique pour l’environnement Autocad avec Notepad++, suite

Changer d'ordinateur sans réinstaller Windows seven 64

PowerClic : Patch de mise à jour vers la version 7.20

Memento .Net pour Autocad

Incompatibilité des tables de données dans les dessins ouverts, Conflit de données d'objet

Coordonnées géographiques et lenteur d’affichage 3d

Installation et mise à jour de PowerClic 7.21 pour Autocad

Civil: Se débarrasser du message "*Avertissement*: objet en propriété multiple'

Créer un système de projection personnalisé à coordonnées réduites pour optimiser les performances des cartes graphiques

Liens entre les entités Autocad avec Visual Lisp 1/3

Liens entre les entités Autocad avec Visual Lisp 2/3

Liens entre les entités Autocad avec Visual Lisp 3/3

G-EAUX

 

 

 

 

 

 

Partager cet article
Repost0
15 janvier 2014 3 15 /01 /janvier /2014 14:06
Conclusion

Il n’y a pas de solution parfaite, la plus simple et la plus robuste ne marche pas avec toutes les entités

Tableau récapitulatif

Méthode de lien

maintien du lien lors des commandes

 

Requête Map

Copier/coller dans le même dessin

Copier/coller d'un dessin à l'autre

commande copier

 

Lien par pointeur 330 dans une section (102 . "{ACAD_REACTORS")

Oui

Oui

Oui

Oui

Simple et très robuste, mais ne marche pas avec toutes les entités

Groupes

Non

Non

Non

Oui

 

Dictionnaire d'extension, xrecord avec pointeur 330

Oui

Oui, parfois des problèmes

Oui

Oui

Pas de limite de nombre de taille ou d'ordre

Dictionnaires d'extension en cascade, xrecord avec pointeur 330

Oui

Oui, parfois des problèmes

Oui

Oui

Dictionnaire d'extension, xrecord avec code 1005 + handle

Non

Non

Non

Non

Dictionnaire d'extension, dictionnaire nommé, xrecord avec pointeur 330

Non

Non

Non

Oui

Toutes les méthodes ci dessus avec pointeur 340 (matériel)

Non, empêche la création de l'entité pointée

Non, empêche la copie de l'entité pointée

Non, empêche la copie de l'entité pointée

Oui

le pointeur 340 a pour intérêt de préserver la purge de l'élément pointé

Réacteurs persistants lisp

Non

Non

Non

Non

 

xdata avec code 1005

Oui

Oui

Oui

Non

Limité à 16 k0, donc n'est adapté qu'à la liaison d'un petit nombre d'entité

 

Liens utiles pour travailler avec les dictionnaires :

L’article sur les dictionnaires et l’éditeur de dictionnaire de Giles Chanteau sur cadXp

Deux outils maisons (plus rustiques, mais complémentaires car ils permettent de visualiser la structure DXF réelle :

Handle_explorer : Explorer votre dessin en parcourant les identifiants

Dic_Explorer, l'explorateur de dictionnaire pour Autocad

Un Lisp pour recréer le lien Acad_reactors entre un Leader et un Mtext

S’il vous arrive d’ouvrir des dessins où ces liens sont brisés, et que vous devez faire de petites mise à jours, vous serez contents de trouver ce petit utilitaire …

 

; ***********************************************************************

;/dxf/recrée le lien perdu entre un leader et un mtext /none

 

(defun c:recree_lien_leader (/ eglead  egmtext elead emtxt id new)

  (setq eglead (entget (car (entsel "\nsélectionnez la ligne repère"))))

  (setq egmtext (entget (car (entsel "\nsélectionnez le mtext, le bloc ou la tolérance "))))

  (setq elead (cdr (assoc -1 eglead)))

  (setq emtxt (cdr (assoc -1 egmtext)))

 

  (setq eglead (pw_subst_ou_aj 340 emtxt eglead))

  (print (entmod eglead))

 

  (setq id (assoc 5 egmtext))

 

  (setq new (pw_cutlistafter egmtext id))

  (setq     new (append

            (car new)

            (list

            '(102 . "{ACAD_REACTORS")

            (cons 330 elead)

            '(102 . "}")

            )

            (cadr new)

          )

  )

  (print (entmod new))

)

 

g-eaux

Partager cet article
Repost0
15 janvier 2014 3 15 /01 /janvier /2014 14:02
Xdatas avec code 1005

Une bonne solution, assez simple peut être l’utilisation de Xdatas avec le code 1005

Dans ce cas-là, le handle de l’entité est stocké sous forme de chaine.

On peut faire un test rapide avec  les commandes des express tools de manipulation des xdata

Ecrire les Xdata :

Commande: XDATA

Choix de l'objet:

Enter application name: MyApp

Application MYAPP already registered.

Enter an option

[3Real/DIR/DISP/DIST/Hand/Int/LAyer/LOng/Pos/Real/SCale/STr/eXit] <eXit>: H

Enter database handle: 11C21

Enter an option

[3Real/DIR/DISP/DIST/Hand/Int/LAyer/LOng/Pos/Real/SCale/STr/eXit] <eXit>:

 

New xdata appended.

Puis pour lire les xdata :

 

Commande: xdlist

Choix de l'objet:

Enter application name <*>:

* Registered Application Name: MYAPP

* Code 1002, Starting or ending brace: {

* Code 1005, Database handle: 11C21

* Code 1002, Starting or ending brace: }

 

Le seul problème c’est que le nombre d’enregistrements est limité.

La mauvaise solution : les groupes

Pourtant, ils semblent avoir toutes les qualités : natifs autocad, simples  à utiliser et visualisables.

Le problème, c’est qu’ils ne sont maintenus que dans le dessin d’origine, et simplement par la commande copier 

Schéma du mécanisme des groupes :

Lorsque des entités sont groupées, Autocad ajoute un ACAD_REACTOR qui pointe vers  l’objet GROUP.

L’objet Groupe contient des pointeurs matériels, c ode 340 qui pointent vers chaque entité du groupe

Exemple d’exploration d’un groupe formé de deux entités :

Commande: HANDLE_EXPLORER

Maintien de l'entité ? * pour saisir à l'écran<11C6> :*

Choix de l'objet:

(-1 . <Nom d'entité: 7ffff67f1e0>)

(0 . "LWPOLYLINE")

(5 . "1E56")

(102 . "{ACAD_REACTORS")

(330 . <Nom d'entité: 7ffff67f200>)

(102 . "}")

(330 . <Nom d'entité: 7ffff60a9f0>)

(100 . "AcDbEntity")

(67 . 0)

(410 . "Model")

(8 . "E-TRO-DISTPOT-IN-CONDUITE-REEL")

(6 . "Continuous")

(100 . "AcDbPolyline")

(210 0.0 0.0 1.0)

 - * - *  - * - * - * - * - * - * - * - * - * - * - *

 Code 330 trouvé: 1E58 <Nom d'entité: 7ffff67f200>

Afficher l'entget entité ?Oui/Non<Oui> :

 

 Ligne précédent l'entité (parfois étiquette: (102 . {ACAD_REACTORS)

    (-1 . <Nom d'entité: 7ffff67f200>)

    (0 . GROUP)

    (5 . 1E58)

    (102 . {ACAD_REACTORS)

    (330 . <Nom d'entité: 7ffff60a8d0>)

    (102 . })

    (330 . <Nom d'entité: 7ffff60a8d0>)

    (100 . AcDbGroup)

    (300 . PowerClic auto group)

    (70 . 0)

    (71 . 1)

    (340 . <Nom d'entité: 7ffff67f1f0>)

    (340 . <Nom d'entité: 7ffff67f1e0>)

- - - - - - - - - - - - - -

 Code 330 trouvé: 1F <Nom d'entité: 7ffff60a9f0>

Afficher l'entget entité ?Oui/Non<Oui> :n

On verra par la suite que c’est peut-être l’utilisation de pointeurs matériels (code 340) qui interdit la persistance de ces groupes

Une autre mauvaise solution : les réacteurs persistants VisualLisp.

Ils sont persistants dans un dessin, mais pas d’un dessin à l’autre, et ne sont pas  attachés aux nouvelles copies du groupe.

Néanmoins, ils permettent une gestion de liens entre les entités grâce au mécanisme de la liste des owners :

(setq ptInsReactor (vlr-object-reactor (list myCircle myBlock) "pt d'insertion Reactor" '((:vlr-modified . ptInsConfondus))))

Ci-dessus la création d’un réacteur entre 2 entités : (list myCircle myBlock) forment le groupe

La méthode la plus « propre » pointeur logiciels et dictionnaires

Les dictionnaires sont certainement  la méthode de stockage d’information la plus recommandée par Autodesk.

Difficile à appréhender au départ car Autocad propose de  nombreuses  structures de stockage des dictionnaires et que la structure Dictionnaire/Xrecord est elle-même assez complexe, mais grâce aux outils de Gilles Chanteau (Edict surtout) on arrive assez vite à s’y retrouver.

Pour résumer :

Règles  hiérachiques :

Les dictionnaires nommés peuvent être directement stockés par le dessin dans le NOD, qu’on retrouve par la fonction lisp (namedobjdict )

Toute entité autocad, (graphique ou non, donc y compris les dictionnaires !)  peut se voir attacher un dictionnaire, mais dans ce cas ce sera un dictionnaire sans nom c'est-à-dire un dictionnaire d’extension.

Tout dictionnaire, nommé ou d’extension, ne peut pas contenir de données directement sans avoir recours à un  Xrecord, lequel  Xrecord peut contenir une infinité de données en mélangeant tous les types de données.

Tout dictionnaire, nommé ou d’extension peut contenir UN dictionnaire d’extension, une infinité de dictionnaires nommés et  une infinité de Xrecord

Tout Xrecord, peut contenir UN dictionnaire d’extension et une infinité de données.

Règles  de dénomination :

Chaque dictionnaire nommé attaché à un même dictionnaire  doit avoir un nom différent, mais le même nom de dictionnaire peut être utilisé indéfiniment à des niveaux différents

Chaque Xrecord (toujours nommé) attaché à un même dictionnaire doit avoir un nom différent, mais le même nom de Xrecord peut être utilisé indéfiniment à des niveaux différents

L’enchainement infini des Dictionnaires et des Xrecord peut donc donner le tournis.

Schéma des structures possibles (non exhaustif)
Dictionnaires attachés au NOD

N.O.D – DictNommé1 – XrecordNommé1 |–  DonnéeChaine

                               |                             |                 |  -    DonnéeNombre

                               |                             |                 |  -    DonnéePointeur

                               |                             |-DictExtension– XrecordNommé1- Donnée

                               |                                                            |– DictNommé1

                               |– DictNommé2

                - …

                - DictNommé n

Dictionnaires attachés à une entité

Entité (graphique ou non) – DictExtension – XrecordNommé1 |–  DonnéeChaine

                                                               |                                                        |  -    DonnéeNombre

                                                               |                                                        |  -    DonnéePointeur

                                                               |-DictExtension– XrecordNommé2 - Donnée

                                                                                              |– DictNommé3

Pourquoi recourir à des hiérarchies aussi compliquées ?

L’intérêt est de pouvoir ranger proprement ses données, en partant du principe que d’autres programmes peuvent eux aussi ajouter  des dictionnaires aux entités.

La tentation est grande de créer d’abord un dictionnaire nommé du nom de votre application « monApp », puis d’y créer un dictionnaire nommé « liens » et enfin d’y créer un Xrecord « entités »

C’est une mauvaise idée, car les dictionnaires nommés brisent le lien lors des opérations de copier/coller et requête map.

Par contre on peut mettre en cascade les dictionnaires d’extension, mais ça n’a pas d’intérêt puisqu’ils n’ont pas de nom.

Donc le seul outil de rangement possible et le xrecord, auquel vous pouvez donner le nom « monApp_lien »

Difficultés de programmation en lisp pur ou en lisp/activeX

En lisp on est rapidement  embrouillé par le fait que l’on doit créer le Dictionnaire ou Xrecord par entmakex avant de l’attacher à l’entité ou au dictionnaire, ce qui n’est pas forcément naturel.

En utilisant les méthodes activeX, le flot de création peut paraître plus naturel pour le 1er niveau hiérarchique, sauf que la confusion arrive vite puisque selon que l’on ajoute un dictionnaire au N.O.D (la collection dictionnaries) ou à un dictionnaire, la méthode à employer n’est pas la même : vla-add ou vla-addobject

Pour ajouter un dictionnaire d’extension, la méthode est encore différente :

On utilise la méthode  vla- getExtensionDictionary, qui apporte de la confusion puisqu’elle crée le dictionnaire s’il n’existe pas.

Pour attacher des xrecords, pas de problème, une seule méthode, vla- AddXRecord, mais pour leur affecter des données, la méthode vla-SetXRecordData nécessite une conversion alambiquée

Je dirais que pour aller vite, il vaut mieux travailler en Lisp pur, pour se familiariser avec les autres langages, et éventuellement porter son travail ensuite en .net, il vaut mieux travailler en activeX, jusqu'a la limite suivante :

Dans le cas ou Autocad tourne sur plateforme 64 bits (c'est maintenant la norme), le pointeur retourné n'est pas utilisable (2 long négatifs au lieu d'un positif), pour ne savoir plus voir ce sujet

 

Prochain article : conclusion

g-eaux

Partager cet article
Repost0
15 janvier 2014 3 15 /01 /janvier /2014 13:19
Problématique

On peut avoir, pour diverses raisons, besoin de créer un lien logique entre 2 ou une infinité d’entités.

La raison peut être l’exécution d’un traitement sur une entité, par un réacteur, lorsqu’une autre entité est déplacée ou modifiée.

Dans ce cas là, on utilisera les mécanismes propres aux commandes VLR- qui gèrent ce problème.

Mais on peut simplement avoir besoin de savoir à quelle entité un texte se rapporte, ou quel s sont les blocs qui sont associés à une polyligne

On peut stocker ces infos « en dur », sous forme de handle chaine, dans  des attributs de bloc, des données d’objet.

Le problème de ces méthodes c’est que le lien se casse dès que l’on fait un copier/coller, une insertion comme bloc décomposé dans un autre dessin, ou lors d’une requête Map.

On va donc explorer les liens qui peuvent persister après les opérations suivantes :

-          {C}Copier/ coller

-          {C}Commande copier

-          {C}Insertion/décomposition de dwg externe

-          {C}Requête map

 L’aide officielle d’Autodesk sur ce sujet : Identificateurs persistants de références inter-objets (DXF)

Un exemple concret de lien persistant : les entités leader Autocad

La  première génération de lignes de repère est composée d’une ligne repère (LEADER) et d’un texte multiple (MTEXT)

Si on déplace le mtext, le leader suit.

L’intérêt de ce lien, c’est qu’il est maintenu lors de copier/coller, copie par la commande copier et requête Map

Comment cela fonctionne-t-il ?

Dans le mtext, un pointeur vers le leader est placé sous cette forme :

  (102 . "{ACAD_REACTORS")

  (330 . <Nom d 'entité: 7ffff68c8c0>)

  (102 . "}")

 

Dans le leader, un pointeur vers le mtext est placé sous cette forme :

(340 . <Nom d     'entité: 7ffff68c8d0>)

Je ne connais pas la fonction appelée en réaction, mais pour le mécanisme d’identification, c’est ça.

Peut-t-on utiliser ce mécanisme pour notre propre usage ?

Oui, on peut utiliser cette méthode avec certaines entités, les plus récentes.

Il suffit d’ajouter  le code dxf  "{ACAD_REACTORS" à l’entité, si ce code existe déjà, on peut ajouter nos propres codes 330, Autocad n’y trouve rien à redire.

 Les entités anciennes ne l’acceptent pas : Voici la liste des entités compatible ou incompatible :

Entité

Fonctionne

U = pas testé

3DFACE

 

X = fonctionne

3DSOLID

u

 

ACAD_PROXY_ENTITY

u

 

ACAD_TABLE

x

 

ARC

   

ARC_DIMENSION

X

 

ATTDEF

X

 

ATTRIB

u

 

BODY

u

 

CIRCLE

   

DIMENSION

x

 

DONUT

x

 

ELLIPSE

x

 

HATCH

x

 

HELIX

u

 

IMAGE

u

 

INSERT

   

LEADER

x

 

LIGHT

u

 

LINE

   

LWPOLYLINE

x

 

MLINE

x

 

MPOLYGON

x

 

MTEXT

x

 

MULTILEADER

u

 

OLE2FRAME

u

 

OLEFRAME

u

 

POINT

   

POLYLINE

   

RAY

x

 

REGION

u

 

RTEXT

u

 

SHAPE

u

 

SOLID

   

SPLINE

x

 

TEXT

   

TOLERANCE

x

 

TRACE

   

VERTEX

u

 

VIEWPORT

u

 

WIPEOUT

x

 

XLINE

x

 

 

Une bibliothèque de fonction pour utiliser ce mécanisme ?

Les fonctions ACET (voir ici) fournissent tout ce qu’il faut, et surtout celle-ci :

ACET-ACADREACTOR-ID-ADD      ( E1  NA2 )

;;exemple d'utilisation :

(setq egAvecReact

       (ACET-ACADREACTOR-ID-ADD

       (car (entsel "\nSélectionnez l'entité pour l'ajout du réacteur :"         )       )

       (car (entsel "\nSélectionnez l'entité à référencer :"))

       )

)

;; -> retourne

'((-1 . <Nom d 'entité: 7ffff626f10>)

   (0 . "LWPOLYLINE")

   (5 .      "1CE1"   )

   (102 . "{ACAD_REACTORS")

   (330 . <Nom d 'entité: 7ffff626f20>);_pointeur vers l'entité référencée

   (102     .     "}"   )

   (330 . <Nom d 'entité: 7ffff6199f0>)

   (100 . "AcDbEntity")

   (67 . 0)

   (410     .     "Model"   )

   (8 . "MonCalque")

   (6 . "Continuous")

   (100     .     "AcDbPolyline"   )

   (90 . 2)

   ....

   (210 0.0 0.0 1.0)

 )

 ;;on a plus qu'à faire le entmod:

 (Entmod egAvecReact)

 Article suivant: 3 autres solutions dont les Xdatas avec code 1005

g-eaux

Partager cet article
Repost0
25 octobre 2013 5 25 /10 /octobre /2013 13:15

 

 

Problématique

Les coordonnées des systèmes Lambert avaient déjà des valeurs importantes en X et Y, surtout le Lambert étendu, avec 2 millions en ordonnée

Avec les nouveaux codes RGF93, on arrive à 9 million pour le CC50

Ces coordonnées mettent à genoux les meilleures cartes graphiques : Pour le comprendre, voir cet article Coordonnées géographiques et lenteur d’affichage 3d (Blog G-Eaux)

 Du coup, on peut être très pénalisé pour travailler en 3d sur un projet d’aménagement, comme le permettent des applications comme Covadis ou Civil 3d .

La parade

On peut être tenté de travailler en local, et donc de translater son projet vers le 0,0 du SCG.

On risque de le regretter rapidement, car on ne pourra plus profiter des sources de données externes géo-référencées pour enrichir son projet.

Ce que je propose, c’est de créer un système personnalisé, basé sur le système RGF93, mais ayant des coordonnées réduites.

Création d’un système personnalisé

Je vous invite à parcourir les deux liens ci-dessous, avec des discussions et un didacticiel.

 MAPCSCREATE : Creation d'un Systeme de Coordonnees sur CadXp

Creation d'un Systeme de Coordonnees - MAPCSCREATE sur Georezo

Sauvegarde du fichier Coordsys.CSD

Avant de commencer, vous pouvez faire une sauvegarde de votre dictionnaire de coordonnées

Category.CSD et Coordsys.CSD se trouvent dans le répertoire :

C:\ProgramData\Autodesk\Geospatial Coordinate Systems

Ces fichiers sont communs à toutes les versions d’Autocad Map installées

En savoir plus : Documentation Autodesk

 

Etude de cas, création du système GX-RGF93.CC46

Nous allons créer un système recentré pour le CC46

Le bute est d’avoir des coordonnées positives dans la zone CC46, réduites au minimum

Création pas à pas
Calcul des paramètres

 

-          Ouvrir un dessin vierge, attribuer le système RGF93.CC46

-          Associer un dessin ayant les contours de la zone CC46

-          Faire une requête dessin

-          Créer le rectangle englobant de la zone, au moins avoir le point bas gauche extrême de la zone

-          On élargie cette zone de 50000, car on peut avoir un projet à cheval sur deux départements

-          Par commodité, on met la resol à 10000, et on prend le point le plus proche du coin bas gauche de ce rectangle, dans notre exemple :

 X = 1300000.0000     Y = 5050000.0000

 

Le but est que ce coin bas gauche ait pour coordonnées 0,0, pour cela, nous allons modifier les fausses coordonnées du système de projection.

Pour cela, il faut déjà connaître ce paramètre, nous allons les afficher avec la commande :

_mapcslibrary

-          Afficher les propriétés du système RGF93.CC46

-          Onglet projection

Noter :

Fausse abscisse : 1700000

Fausse ordonnée : 5200000

Calculer la nouvelle Abscisse et ordonnée :

1700000 – 1300000 =  400000

5200000 – 5050000 = 150000

Création du système recentré

Lancer la commande _ADEDEFCRDSYS

Etape 1

Etape 2

Etape 3 préciser votre modèle, ici le RGF93.CC46

Etape 4 On Nomme le code (préfixe GX-) et on le décrit, et on précise la source : pensez que d’autre personnes peuvent rencontrer votre code

Etape 5 On remplit les fausses coordonnées calculées auparavant, ne pas toucher au reste

Etape 6 : ne rien toucher

Vérification du résultat

-          Déplacer  les entités de votre dessin de l’origine de votre zone, X = 1300000.0000     Y = 5050000.0000   vers 0,0.

-          Attribuer votre nouveau code au dessin : GX-RGF93.CC45

-          Associez votre carte de France Lambert E

-          Requête sur la carte

1 Le résultat de requête: la carte de France est parfaitement calée

Liaison avec google explorer

Votre nouveau système fonctionnera sans problème en export et en import

Partage de votre nouveau code

Vous n’avez rien à faire : le code est stocké dans le dessin

 

Pour que le code stocké dans un dessin soit ajouté à votre bibliothèque

_Mapoptions

Pour modifier ou supprimer un code

Le mieux et de taper directement la commande _mapcslibrary

En savoir plus :

Modification ou suppression d'un système de coordonnées universelles

Code lisp

Le code suivant vous sera peut être utile, il permet de projeter des entités d’un système vers un autre dans le dessin courant

La routine utilise les bibliothèques PowerClic, je vous invite à télécharger et installer la dernière version.

;§/MAP/Reprojete des entité du systeme actuel vers un autre système/none

 

(defun c:reprojete_entites (/ sel lsel eg ent)

 

  ;; Sets the source coordinate system for converting points.

  (pw_bydefault "curproj" (ade_projgetwscode))

  (pw_getstringmem "\nProjection source ?" "curproj")

  (ade_projsetsrc curproj)

 

  ;;Sets the destination coordinate system for converting points.

  (pw_bydefault "destproj" "IGN-IIE")

  (pw_getstringmem "\nProjection destination ?" "destproj")

 

  (ade_projsetdest destproj)

  (Prompt

    "\nSélectionnez les entités INSERT,POINT,CIRCLE,LWPOLYLINE,LINE,TEXT,MTEXT à reprojeter : "

  )

  (setq

    sel     (ssget

        '((0 . "INSERT,POINT,CIRCLE,LWPOLYLINE,LINE,TEXT,MTEXT"))

      )

  )

  (setq lsel (pw_listsel sel))

  (foreach ent lsel

    (setq eg (entget ent))

    (setq

      eg (mapcar '(lambda (x)

                (cond ((= 10 (car x))

                     (print x)

                     (setq x (cdr x))

                     (cons 10 (pw_pt_2d (ade_projptforward x)))

                    )

                    ((= 11 (car x))

                     (print x)

                     (setq x (cdr x))

                     (cons 11 (pw_pt_2d (ade_projptforward x)))

                    )

                    (t

                     x

                    )

                )

              )

             eg

       )

    )

    (entmod eg)

    (entupd ent)

  )

)

Perspectives

On peut faire des codes encore plus centrés, à l’échelle d’un département, ou partager en 3 une zone CC : Ouest, Centre, Est.

On peut faire ce que l’on veut, dès l’instant où l’on prend garde de bien préfixer le nom de son code, de  renseigner  les champs description et source de son code, pour ne pas polluer le monde géomatique de systèmes  inconnus et dons ingérables.

 

 


G-EAUX

Partager cet article
Repost0
16 mai 2013 4 16 /05 /mai /2013 12:05
Se débarrasser d’un message ennuyeux : CLEARMULTIPLYOWNEDOBJECT

 

Les objets en propriété multiple semblent être un problème spécifique à Autocad civil.

Ils se caractérisent par une série de message lors de la sauvegarde du dessin :

*Avertissement*: objet en propriété multiple, maintien "B6DA"

Ou avec les versions anglaises :

*Warning* Multiply owned object, handle "B6DA"

La méthode de résolution employée est préconisée sur ce Blog Civil Autodesk.

J’utilise une astuce que j’avais mis au point pour un autre problème, voir cet article sur cadxp.

Il s’agit de récupérer la liste des handle défectueux à partir de la fenêtre texte d’Autocad.

La routine utilise les bibliothèques PowerClic, je vous invite à télécharger et installer la dernière version.

 Comme il me semble avoir déjà rencontré des entités graphiques comportant ce problème, lorsqu’une entité est graphique, elle est passée en couleur jaune au lieu d’être effacée.

Le code gère les messages français « *Avertissement*: » et anglais « *Warning* », vous pourrez l’adapter à votre message local.

 

Code lisp

 

;;************************************************************************

;/DEBUG/supprimer les entités qui pose un problème *Avertissement*: objet en propriété multiple, maintien  / none

;;*Avertissement*: objet en propriété multiple, maintien "B6DA"

;;*Warning* Multiply owned object, handle

 

(defun c:clearMultiplyOwnedObject (/ llign lign pos fname f wait  lerror lhandle ent tp)

 

  (setq fname (getvar "LOGFILENAME"))

 

  (pw_setvar1 "LOGFILEMODE" 0)

  (pw_setvar1 "CMDECHO" 0)

  (vl-file-delete fname)

  (setvar "LOGFILEMODE" 1)

  (command "_qsave")

  (while (= 1 (getvar "cmdactive"))

    wait

  )

  (command "_delay" 50)

  (setvar "LOGFILEMODE" 0)

  (setq fname (getvar "LOGFILENAME"))

 

  (setq f (open fname "r"))

 

  (while (setq lign (read-line f))

    (setq llign (cons lign llign))

  )

  (close f)

 

 

  (pw_setvar2 "LOGFILEMODE")

  (pw_setvar2 "CMDECHO")

  (setq llign (reverse llign))

  (if (not

      (setq

        lerror (pw_wcmatch_list llign "*objet en propriété multiple*")

      )

      )

    (setq lerror (pw_wcmatch_list llign "*Multiply owned object*"));_put here your own localised message

  )

 

  (if lerror

    (progn

 

      (setq lhandle (mapcar '(lambda (x /)

                         (setq x (pw_lst_de_ch x " "))

                         (setq x (last x))

                         (setq x (vl-string-trim "\"" x))

 

                       )

                      lerror

                )

      )

    )

  )

  (setq lhandle (PW_REDUCT_LIST lhandle))

  (if lhandle

    (progn

      (setq lentity (mapcar 'strcase (mapcar 'car PW-L-ENT-CMD)))

      (foreach ent lhandle

      (setq tp (cdr (assoc 0 (entget (setq ent (handent ent))))))

      (if (not (member tp lentity))

        (entdel ent)

        (print tp)

      )

      )

    )

  )

)


G-EAUX

 

Partager cet article
Repost0