CADxp: Lire une info depuis une application externe - CADxp

Aller au contenu

Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

Lire une info depuis une application externe (connaitre le nom de la photo affichée dans un visualisateur)

#1 L'utilisateur est hors-ligne   GEGEMATIC 

  • ceinture noire 1er dan
  • Groupe : Membres
  • Messages : 890
  • Inscrit(e) : 04-novembre 05

Posté 20 juin 2019 - 17:02

Salut à tous,
dans une affaire, je dois créer des hyperliens depuis des photos.
j'ai tout ce qu'il faut coté hyperliens pour créer un hyperlien dans le sens:
-objet pour hyperlien,
-création hyperlien
-choix de la photo.

sauf qu'a l'usage, je préfèrerai visionner mes photos, et quand une me plait,
créer l'hyperliens.

Mon idée: ouvrir une appli de visualisation de photo, n'importe laquelle, disons Xnview,
quand la photo est bonne, je crée mon hyperlien qui va prendre le nom de la photo affichée (et éventuellement son chemin)

j'ai vu ce sujet:
retour appli externe
mais je me demande où Bonus a trouvé la propriété "status", car elle n'est pas documentée lorsque l'on fait un dump.

toute idée est la bienvenue, je peux bien sur entrer le nom de la photo manuellement, mais ce serait vraiment un plus de faire comme ça.

a+
gégé
---------------------------------------------------------------------- PowerClic sur http://www.g-eaux.com
0

#2 L'utilisateur est hors-ligne   bonuscad 

  • ceinture rouge et blanche 8em dan
  • Groupe : Membres
  • Messages : 4681
  • Inscrit(e) : 20-juin 03

Posté 20 juin 2019 - 17:32

Citation

mais je me demande où Bonus a trouvé la propriété "status", car elle n'est pas documentée lorsque l'on fait un dump.


Pour être honnête ce n'est pas de moi, je pense l'avoir pompé ICI

Mais ce que je comprends de:
(while ( = (vlax-get-property AppHandle 'Status ) 0) (Sleep 1000))


C'est que tant que l'application a le statut d'être lancée la fonction lisp attends 1000 ms (1 seconde) pour ré-éxaminer son statut de façon a pouvoir reprendre la main dès que l'application externe est fermée.
Donc je pense qu'avec cette méthode tu devra lancer xnview autant de fois que tu voudras avoir un lien, pas cool... A moins que tu construise une liste d'info dans xnview qui serait transmise à la fin: mais permet-il cela???

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
0

#3 L'utilisateur est hors-ligne   Fraid 

  • ceinture noire 3em dan
  • Groupe : Membres
  • Messages : 1915
  • Inscrit(e) : 08-août 05
  • LocationST Malo 35

Posté 20 juin 2019 - 19:51

Bonjour,

Si tu connais un peux le html et javascript , il me semble que l'on peut faire un visionneur de photo, intégrer à une palette et placer son chemin, par exemple, dans le presse papier à chaque clic.

pas le temps en ce moment de pencher vers cela.

mais dès que je peux... :rolleyes:
...plus je sais où je suis, moins je sais où je vais....
Extrait d'une double interview simultanée d'une particule élémentaire.
0

#4 L'utilisateur est hors-ligne   GEGEMATIC 

  • ceinture noire 1er dan
  • Groupe : Membres
  • Messages : 890
  • Inscrit(e) : 04-novembre 05

Posté 21 juin 2019 - 07:26

Salut Fraid,
c'est le type de solution que j'envisage, faire un visualisateur basic en .net
mais c'est pareil, je manque toujours de temps ...

Au départ, je pensais utiliser la Visionneuse de photos Windows,
en me disant qu'elle serait certainement bien exposée en .com
et que je pourrai la manipuler comme excel ou word.
mais malheureusement, cet outil n'est pas visible directement, il est hébergé par dllhost.exe
et je ne sais donc pas comment l'utiliser.
a+
Gégé
---------------------------------------------------------------------- PowerClic sur http://www.g-eaux.com
0

#5 L'utilisateur est hors-ligne   GEGEMATIC 

  • ceinture noire 1er dan
  • Groupe : Membres
  • Messages : 890
  • Inscrit(e) : 04-novembre 05

Posté 21 juin 2019 - 07:43

En fait en regardant ce matin, grâce à Process explorer,
what-is-it-running
j'ai pu trouver la dll de photoviewer:
C:\Program Files\Windows Photo Viewer
mais on ne peut pas l'ajouter comme composant com.
a+
gégé
---------------------------------------------------------------------- PowerClic sur http://www.g-eaux.com
0

#6 L'utilisateur est hors-ligne   GEGEMATIC 

  • ceinture noire 1er dan
  • Groupe : Membres
  • Messages : 890
  • Inscrit(e) : 04-novembre 05

Posté 21 juin 2019 - 14:29

salut,
finalement je me suis tourné vers une solution qui me paraissait archi simple ce matin,
mais qui au final ne l'était pas tant que ça.
J'ai donc du renoncer un peu, mais finalement j'ai ça:
Il faut copier la photo dans le visualisateur, puis la coller dans le dessin, et ensuite lancer la commande place_hyper_photo

;;*************************************************************
;;§/hyperliens/a partir de la dernière phot collée, place un hyperlien multileader/ none

(defun c:place_hyper_photo (/  ech etype img oimg chem lea  )
 (setq etype (cdr (assoc 0 (entget (setq img (entlast))))))
 (if (= etype "IMAGE")
  (progn
   (setq oimg (vlax-ename->vla-object img))
   (setq chem (vla-get-imagefile oimg))
   (command "_.MLEADER"
	    pause
	    pause

   )
   (setq lea (entlast))
   (if (/= lea img)
    (ajoute_hyperlien lea chem chem "")
    (prompt "\nPas de ligne repère créée")
   )
   (entdel img)
  )
 )
 (prompt "\nPas d'image collée")
)

;***********************************************************************
;;§/hyperliens/crée un hyper-lien sur un objet/ ename lien emplacement desc
;; emplacement uniquement utile pour page web, defaut ""
;;(ajoute_hyperlien  (enam) lien (strcat "Rep " lien) "")
;;(ajoute_hyperlien  (enam) lien (strcat "Rep " lien) "")
;
(defun ajoute_hyperlien	(ename lien desc emplacement / vlaobj vlahyp)
 (setq vlaobj (vlax-ename->vla-object ename))
 (setq vlahyp (vlax-get-property vlaobj 'Hyperlinks))
 (setq emplacement (vlax-make-variant emplacement))
 (setq desc (vlax-make-variant desc))
 (cond
  ((and desc emplacement)
   (vlax-invoke-method vlahyp 'Add lien desc emplacement)
  )
  (desc
   (vlax-invoke-method vlahyp 'Add lien desc)
  )
 )
)



je vous explique ensuite les ,pb rencontrés pour faire mieux...
a+
gégé
---------------------------------------------------------------------- PowerClic sur http://www.g-eaux.com
0

#7 L'utilisateur est hors-ligne   GEGEMATIC 

  • ceinture noire 1er dan
  • Groupe : Membres
  • Messages : 890
  • Inscrit(e) : 04-novembre 05

Posté 21 juin 2019 - 14:47

je voulais faire qq chose de mieux,
mais j'ai eu un pb insoluble, le fait que _pastclip ne soit pas terminé avant que l’interpréteur lisp ne passe à autre chose.
;;*************************************************************
;;§/hyperliens/chainage de pasteclip d'une photo puis création du lien/ none
;;ne marche pas car la commande "_pasteclip" ne temporise pas: la suite s'exécute alors que la commande n'est pas finie
;
(defun c:paste_hyper_photo (/ en chem jpg lf)
 (setq lastent (entlast))
 (setq pt (getpoint "\nEntrez la position de la flèche de direction de l'hyperlien"))
 ;;(vl-cmdf "_pasteclip" pt 10 0)
 (vla-SendCommand (vla-get-ActiveDocument (vlax-get-acad-object)) "_pasteclip 0,0 10 0")
 (setq img (entlast))
 (if (/= img lastent)
  (progn
   (setq oimg (vlax-ename->vla-object img))
   (setq chem (vla-get-imagefile oimg))
   ;;(pau)
   ;;(entdel (entlast))
   ;;ImageFile = "E:\\ACLSP\\dwg14\\Saint-Gobain\\2019\\PHOTOS\\2019-06-14\\PHOTOGRAMMETRIE\\P1760799.JPG"
   (setq lastent (entlast))
   (command "_.MLEADER"
	    pt
	    pause

   )
   (setq lea (entlast))
   (if (/= lea lastent)
    (ajoute_hyperlien lea chem chem "")
    (prompt "\nPas de ligne repère créée")
   )
  )
 )
 (entdel img)
 (prompt "\nPas d'image collée")
)

j'ai donc essayé une autre méthode pour lire ce presse papier:
merci patrick ...

mais outre qu'il y a un pb de sécurité qui ouvre un dialogue malencontreux,
on arrive pas à lire autre chose que du texte, je ne sais pas si il existe d'autre mots clefs.

donc j'ai arrêté là.
a+
gégé
---------------------------------------------------------------------- PowerClic sur http://www.g-eaux.com
0

#8 L'utilisateur est hors-ligne   Fraid 

  • ceinture noire 3em dan
  • Groupe : Membres
  • Messages : 1915
  • Inscrit(e) : 08-août 05
  • LocationST Malo 35

Posté 03 juillet 2019 - 11:48

Bonjour,
Cela ne correspond pas pile poil à ta demande, mais je pense que tu sauras l'adaptée.
Une fonction Autolisp qui lance une visionneuse en html qui retourne le chemin de l'image choisie.
C'est aussi en suite de ce Post, mais sans l'API javascript d'Autocad morte née...

Tout d'abord les fichiers à télécharger ici le zip
à décompresser dans c:/Data/ si vous ne voulez pas éditer les fichiers.

et oui, beaucoup de fichiers, mais nous allons "ouvrir" que ceux qui commence par acadvue.

acadvue.lsp

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;acadvue : Fonction retournant le chemin d une image choisie dans une visionneuse html.
;Argument dir : String, chemin du dossier contenant les images.
;Retour : String, chemin de l image choisie, nil si echec.
;Dépendances : DOSLIB ( https://wiki.mcneel.com/doslib/home )
;Compatible Autocad 2014 et au dela.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;By Fraiddd 07/2019;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun acadvue (dir / listefichier oldcmdecho)
(setq oldcmdecho (getvar "cmdecho"))
(if (vl-file-directory-p dir)
 (foreach file '("*.svg" "*.jpg" "*.jpeg" "*.png" "*.gif");A éditer selon les besoins
    (mapcar '(lambda (OoO);Pour chaque fichier
        (setq   OoO (dos_strreplace OoO "\\" "/");Inversion des obliques pour etre lisible par javascript
                OoO (dos_strreplace OoO " " "%20");Remplacement des éventuels espaces
                listefichier (cons (strcat "\"" OoO "\"") listefichier);Construction de la liste en rajoutant 2 guillemets
        )
    )
    (dos_find (strcat dir file));Liste des fichiers
    )
  )
  (princ "^\nChemin invalide")
) 
(if listefichier
(progn
    (setvar "cmdecho" 0)
    (setq listefichier (lst2str (reverse listefichier) ","));Retournement et Conversion de la liste en texte 
     ;Ecriture d une liste javascript en utf-8
    (dos_writetextfile "c:/Data/acadvue/js/acadvuedir.js" (list (strcat "var listeimgs = [" listefichier "];")) nil 2)
    (dos_clipboard "");Vidage du presse papier
    (command "_webload" "" "c:/Data/acadvue/js/acadvueload.js");Lancement de la visionneuse
    (while (not (dos_clipboard));On attent tant que le presse-papier est vide
        (command "_.delay" 2000)
    )
    (setvar "cmdecho" oldcmdecho)
    (dos_strreplace (dos_clipboard) "%20" " ");Replacement des éventuels espaces
)
nil
)
)
;;============================================================;;
;; Concatène une liste et un séparateur en une chaine(gile)
;; Arguments
;; lst : la liste à transformer en chaine
;; sep : le séparateur
(defun lst2str (lst sep)
  (if (cdr lst)
    (strcat (vl-princ-to-string (car lst)) sep (lst2str (cdr lst) sep))
    (vl-princ-to-string (car lst))
  )
)
;;============================================================;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;Exemple d utilisation
(defun c:acv (/ oldsecureload dossier image *error*)
(defun *error* ( msg );Restaure la variable secureload en cas d erreur
    (setvar "secureload" oldsecureload)
    (or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
        (princ (strcat "\n** Error: " msg " **")))
    (princ)
 )
(setq oldsecureload (getvar "secureload"))
(setvar "secureload" 0);Ce n est pas conventionnel...
 (if (setq  dossier (dos_getdir "acadVue" "C:\\" "Sélectionnez un dossier contenant des images." nil))
    (setq image (acadvue dossier));On lance acadVue
    (setq image "unload");si on annule la selection du dossier
 )
 (setvar "secureload" oldsecureload);Restaure la variable secureload
 
 (cond  ((= image "unload")(princ (strcat "\nAbandon" )));Si annulation du choix du dossier
        ((= image nil)(princ (strcat "\nAucune image dans le dossier: Abandon" )))
        (image (princ (strcat "\nLe fichier " image " a été choisi" )))
 )
(princ)
)


acadvueload.js, lancé par la fonction Autolisp avec "_WEBLOAD"

 window.open('C:/Data/acadvue/acadvue.html',
			'acadVue', 
'height=920, width=880, top=50, left=400, toolbar=no, menubar=no, location=no, resizable=yes, scrollbars=yes, status=no');


acadvue.html, ouvert par le précédant.

<!DOCTYPE HTML>
<html lang="fr">
<head>
    <title>acadVue</title>
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    <link href="./css/bootstrap.css" rel="stylesheet">
    <link href="./css/acadVueStyle.css" rel="stylesheet">
    <link href="./css/font-awesome.min.css" rel="stylesheet"><!-- https://fontawesome.com/v4.7.0/icons/ -->
    <script src="./js/jquery-3.4.1.min.js"></script>
    <script src="./js/popper.min.js"></script>
    <script src="./js/bootstrap.min.js"></script>
    <script src="./js/jQueryRotate.js"></script>
</head>
<body>
<div class="container">
    <header class="row">
    <div class="col-lg-12" id="titre">
      <h1 class="bg-primary text-white text-center"><strong>acadVue</strong></h1>
    </div>
    </header>
    <div class="row" id="content">
    <div class="col-lg-12 text-center" >
        <a class="text-primary">____</a>
        <button type="button" id="rotleftbutton" class="btn btn-primary ">
		     <i class="fa fa-undo fa-rotate-180 fa-flip-horizontal" aria-hidden="true"></i>
		</button>
        <a class="text-primary">____</a>
        <button type="button" id="choicebutton" class="btn btn-primary ">Choisir</button>
        <a class="text-primary">____</a>
        <button type="button" id="rotrightbutton" class="btn btn-primary ">
		     <i class="fa fa-undo" aria-hidden="true"></i>
		</button>
        <a class="text-primary">____</a>
    </div>
    <div class="col-lg-12 align-content-center" >
        <div id="acadVueCarousel" class="carousel slide" data-ride="carousel" data-interval="false">
        <div class="carousel-inner" id="inner"></div>
        <a class="carousel-control-prev" href="#acadVueCarousel" role="button" data-slide="prev">
            <span class="carousel-control-prev-icon" aria-hidden="true"></span>
            <span class="sr-only">Previous</span>
        </a>
        <a class="carousel-control-next" href="#acadVueCarousel" role="button" data-slide="next">
            <span class="carousel-control-next-icon" aria-hidden="true"></span>
            <span class="sr-only">Next</span>
        </a>
        </div>  
    </div>
    </div>
    <!-- <footer class="row"> -->
    <!-- </footer> -->
</div>
<script src="./js/acadvuedir.js"></script>
<script src="./js/acadvueutil.js"></script>
<script src="./js/acadvuebuilder.js"></script>
<script src="./js/acadvuereac.js"></script>
</body>
</html> 


acadvuebuilder.js, qui écrit une partie du caroussel html, selon la liste transmise par le lisp et lancer dans le html, créant une variable globale listeimgs .

var nbimgs =listeimgs.length;//nombre d'images
//Ecriture de la 1ere ligne des introducteurs (image active)
document.getElementById("inner").innerHTML += 
    '<div class="carousel-item active"><img src=' + 
    listeimgs[0] + 
    ' class="mx-auto d-block img-thumbnail w-75" alt=' + 
    nameSrc(listeimgs[0]) + 
    '><div class="carousel-caption"><h3>' + 
    nameSrc(listeimgs[0]).replace(/%20/g, " ") + 
    '</h3></div></div>';
    
 //Ecriture des autres lignes si plus d'une image   
if (nbimgs > 1){
    for (var i = 1; i < nbimgs; i++){
        document.getElementById("inner").innerHTML += 
            '<div class="carousel-item"><img src=' + 
            listeimgs[i] + 
            ' class="mx-auto d-block img-thumbnail w-75" alt=' + 
            nameSrc(listeimgs[i]) + 
            '><div class="carousel-caption"><h3>' + 
            nameSrc(listeimgs[i]).replace(/%20/g, " ") +
            '</h3></div></div>';
    }
}



acadvuereac.js,

// Réaction des boutons en jquery + javascript
$('#choicebutton').on('click', function(){//si on clic sur le bouton choisir
    var imageActive = $('.carousel-inner .active img'),//On récupère l'image active
        cheminimageActive = imageActive[0].getAttribute('src');//On récupère le chemin complet de l'image
    copyStringToClipBoard(cheminimageActive);//on le copie dans le presse papier
    setTimeout(window.close(),2000);//On ferme la fenêtre
});
$('#rotrightbutton').on('click', function(){//si on clic sur le bouton tourné vers la droite
    var imageActive = $('.carousel-inner .active img'),//On récupère l'image active
        deg = $(imageActive).getRotateAngle(),//On récupère son angle de rotation
        deg  = parseInt(deg) - 90;//On y enlève 90 degré
    $(imageActive).rotate({ animateTo:deg});//on tourne l'image
});     
$('#rotleftbutton').on('click', function(){//si on clic sur le bouton tourné vers la gauche
    var imageActive = $('.carousel-inner .active img'),//On récupère l'image active
        deg = $(imageActive).getRotateAngle(),//On récupère son angle de rotation
        deg  =  parseInt(deg) + 90;//On y ajoute 90 degré
    $(imageActive).rotate({ animateTo:deg});//on tourne l'image
});     



acadvueutil.js

// Déduire le nom d'un fichier de son lien en javascript.
function nameSrc(source) {
     var name = source.slice(source.lastIndexOf("/") + 1, source.length);
     return name;
};
//Copier un texte dans le presse papier en jquery
function copyStringToClipBoard(texte){
    var $temp = $('<input>');
    $("body").append($temp);//création d'une entrée texte temporaire
    $temp.val(texte).select();//on lui transmet l'argument texte et on le selectionne
    document.execCommand("copy");//copie dans le presse papier
    $temp.remove();//efface l'élément temporaire
};



Il y a donc 2 exemples d'interpolation:
Autolisp vers Javascript par l’écriture d'une variable Javascript globale
Javascript vers Autolisp par le presse papier

les puriste regretterons l'utilisation abusive du DOSLIB, mais comme c'est Framework partie, autant rester dans le même esprit.

Je suis désolé de mes maladresses éventuelles, je ne suis qu'un apprenti.
une fois que vous avez charger le DOSLIB correspondant a votre Autocad,
il suffit d'approuvé le dossier acadvue puis de charger acadvue.lsp et taper acv pour tester.
...plus je sais où je suis, moins je sais où je vais....
Extrait d'une double interview simultanée d'une particule élémentaire.
0

Partager ce sujet :


Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

1 utilisateur(s) en train de lire ce sujet
0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)