GEGEMATIC Posté(e) le 20 juin 2019 Posté(e) le 20 juin 2019 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 externemais 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.frBlog: http://g-eaux.over-blog.com
bonuscad Posté(e) le 20 juin 2019 Posté(e) le 20 juin 2019 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
Fraid Posté(e) le 20 juin 2019 Posté(e) le 20 juin 2019 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... https://github.com/Fraiddd
GEGEMATIC Posté(e) le 21 juin 2019 Auteur Posté(e) le 21 juin 2019 Salut Fraid,c'est le type de solution que j'envisage, faire un visualisateur basic en .netmais 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 .comet que je pourrai la manipuler comme excel ou word.mais malheureusement, cet outil n'est pas visible directement, il est hébergé par dllhost.exeet je ne sais donc pas comment l'utiliser.a+Gégé ----------------------------------------------------------------------Site: https://www.g-eaux.frBlog: http://g-eaux.over-blog.com
GEGEMATIC Posté(e) le 21 juin 2019 Auteur Posté(e) le 21 juin 2019 En fait en regardant ce matin, grâce à Process explorer,what-is-it-runningj'ai pu trouver la dll de photoviewer:C:\Program Files\Windows Photo Viewermais on ne peut pas l'ajouter comme composant com.a+gégé ----------------------------------------------------------------------Site: https://www.g-eaux.frBlog: http://g-eaux.over-blog.com
GEGEMATIC Posté(e) le 21 juin 2019 Auteur Posté(e) le 21 juin 2019 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.frBlog: http://g-eaux.over-blog.com
GEGEMATIC Posté(e) le 21 juin 2019 Auteur Posté(e) le 21 juin 2019 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.frBlog: http://g-eaux.over-blog.com
Fraid Posté(e) le 3 juillet 2019 Posté(e) le 3 juillet 2019 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 globaleJavascript 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. https://github.com/Fraiddd
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant