Aller au contenu

Lire une info depuis une application externe


GEGEMATIC

Messages recommandés

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é

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

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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:

Lien vers le commentaire
Partager sur d’autres sites

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é

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

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

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é

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

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

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é

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

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

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é

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

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

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.

Lien vers le commentaire
Partager sur d’autres sites

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é