-
Compteur de contenus
397 -
Inscription
-
Dernière visite
Type de contenu
Profils
Forums
Calendrier
Blogs
Tout ce qui a été posté par Serge
-
LFA, Le MVPort est basé sur la présence d'une fenêtre en espace papier que l'on veut voir en espace objet. Est-ce que ces principes existent sur les autres logiciels ? Le MVPort est un objet personnalisé se servant de racteurs. Est-ce que ces choses sont disponibles ailleurs ? Tramber, Je ne suis aucunement au courant des ventes des autres produits. J'ai cependant appris plusieurs choses en vendant des logiciels à large diffusion: 1) Il faut un produit plus que parfait ; les gens chercheront toujours un coupable lorsque leur insatllation ira de travers et c'est toujours celui qui est absent qui sera pointé du doigt. Ça nous est déjà arrivé et heureusement qu'on pouvait être assez proche de ces clients pour leur démontrer que la faute était ailleurs. Le MVPort est très stable. J'ai eu l'occasion de présenter les sources à des très hauts responsables techniques chez Autodesk et on a rec¸des éloges pour la clarté du code, le respect des normes MDI, les algorithmes mathématiques, etc. Pour ObjectDcl, on m'a déjà dit que ça pouvait planter sauf que ces personnes ont ils fait tout le nécessaire pour faire la lumière et une auto-critique ? 2) Ça prend un produit qui soit extrêmement facile à utiliser. Par contre, et ceux qui ont développer le savent, plus ça parait simple, et plus il y a du travail derrière. Celui qui ne connait pas la programmation ne comprend pas la justification du prix. 3) Faire la mise en marché d'un add-on coute terriblement cher. Par exemple, nous payions 5000$/mois pour une petite annonce dans des revues spécialisées. Nous avons payé pour des trades show, des séminaires, pour former un réseau de distributeurs. On s'est heurté à toute sorte de monde. Un cas particulier dont je ne peux divulguer les noms : on nous a dit que notre produit permettrait d'épargner mais que le problème est que le client et le fournisseur ne vont pas en appel d'offres et que plus il y avait d'heures, mieux c'était. J'ai ai plein d'autres du genre. 4) Le MVPort est bien vivant soit dit en passant et il sera (à mon avis) davantage requis lors d'une prochaine version pour ses capacités 3D 5) Lundi prochain, nous allons enfin déployer un logiciel qui nous a demandé plus de 5000 en recherche et développement. C'est ce qui explique que depuis un an je suis beaucoup moins présent sur les forums. Sans dire de quoi il s'agit, je l'annoncerai le momemt venu, c'est un projet qui nous a permit de développer une très solide expertise en C++ et en DotNet avec des concepts tout-à-fait révolutionnaires. Je vis dans les Dataset, les DataAdaptor, les connection, les datagrids, dans la gestion d'événements, dans les objets dérivés, dans les Com wrapper, les safearray, etc. mais aussi dans la gestion de startégies, de priorités, de budget et de ressources humaines. Je sens présentement un lourd fardeau sur mes épaules se libérer. Vive les vacances bientôt Serge
-
Tramber, Effectivement, je dois aiguiser mon anglais puisque je visiterai Paris prochainement (c'est une blague mais qui a un fond de vérité). Zeb, Compétionner veut dire entrer en compétition, ou encore émuler, ou encore offrr un produit comparable (ou même inférieur) mais qui a derrière l'étandard Autodesk. Ça pouvait aussi être une prise de contrôle plutôt qu'une compétition. Et pour ne pas être perdu dans la traduction, les mots exacts furent : "With AutoDesk and ObjectDCL all I can say at this point is that I am loosing sales because of this impending sale that everyone believes will happen." Évidemment, ceci n'est vraiment plus d'actualité car c'était juste avant le lancement d'une nouvelle version d'AutoCAD il y a 4 ans et le produit si craint ne s'est jamais manifesté. Nous même avions connu un féchissement des ventes à ce moment. Serge
-
Eric, Ce document a-t-il reçu l'assentiment de celui qui avait choisi les 2 lettres ? J'ai comme l'impression qu'Autodesk n'a jamais elle-même su de façon formelle ce que ça signifiait. Serge
-
gile, Mon style est très différent selon que ce soit 1) pour notre propre firme où là c'est blindé et largement documenté 2) pour un message s'adressant à un expert qui saura extraire les idées 3) pour un message s'adressant à un novice. Par exemple, sur l'autre forum, quelqu'un demandait cette semaine de trouver les 2 foyers d'une ellipse. Tu pourras voir que le code est beaucoup plus explicite (code plus loin). J'utilise beaucoup la forme: (cond ...(condition1) ...(condition2) ) ou encore (and ...(condition1) ...(condition2) ) Voici le programme d'ellipse pour ceux que ça intéresse. Chaque étape du cond valide que l'on obtient de valeurs. ;;; FOYER - Indique les foyers d'une ellipse ;;; Par Serge Camiré, Cad-Novation. 2005-06-08 ;;; (defun c:foyer ( / a angle1 angle2 b c centre ellipse ellipseGet ellipseSel foyer1 foyer2 major minor origine vaCentre vaMajor vaMinor vlaEllipse ) (cond ((not (setq ellipseSel (entsel "\nMontez une ellipse: "))) nil) ((not (setq ellipseGet (entget (setq ellipse (car ellipseSel))))) nil) ((/= "ELLIPSE" (cdr (assoc 0 ellipseGet))) nil) (t (setq vlaEllipse (vlax-ename->vla-object ellipse)) (setq vaCentre (vla-get-Center vlaEllipse)) (setq vaMajor (vla-get-MajorAxis vlaEllipse)) (setq vaMinor (vla-get-MinorAxis vlaEllipse)) (setq centre (safearray-value (variant-value vaCentre))) (setq major (safearray-value (variant-value vaMajor))) (setq minor (safearray-value (variant-value vaMinor))) (setq origine '(0.0 0.0 0.0)) (setq a (distance origine major)) (setq b (distance origine minor)) (setq c (sqrt (- (* a a) (* b b)))) (setq angle1 (angle origine major)) (setq angle2 (+ angle1 pi)) (setq foyer1 (polar centre angle1 c)) (setq foyer2 (polar centre angle2 c)) (princ "\nFoyer 1 : ") (princ foyer1) (princ "\nFoyer 2 : ") (princ foyer2) ) ) (princ) ) (princ "\nTapez FOYER pour connaitre les foyers d'une ellipse") (princ "\nPourquoi ne pas essayer un MVPort dans l'intimité de votre foyer.") (princ) Ça aurait aussi pu s'écrire: (defun c:foyer ( / a angle1 angle2 b c centre ellipse ellipseGet ellipseSel foyer1 foyer2 major minor origine vaCentre vaMajor vaMinor vlaEllipse ) (and (setq ellipseSel (entsel "\nMontez une ellipse: ")) (setq ellipseGet (entget (setq ellipse (car ellipseSel)))) (= "ELLIPSE" (cdr (assoc 0 ellipseGet))) (setq vlaEllipse (vlax-ename->vla-object ellipse)) (setq vaCentre (vla-get-Center vlaEllipse)) (setq vaMajor (vla-get-MajorAxis vlaEllipse)) (setq vaMinor (vla-get-MinorAxis vlaEllipse)) (setq centre (safearray-value (variant-value vaCentre))) (setq major (safearray-value (variant-value vaMajor))) (setq minor (safearray-value (variant-value vaMinor))) (setq origine '(0.0 0.0 0.0)) (setq a (distance origine major)) (setq b (distance origine minor)) (setq c (sqrt (- (* a a) (* b b)))) (setq angle1 (angle origine major)) (setq angle2 (+ angle1 pi)) (setq foyer1 (polar centre angle1 c)) (setq foyer2 (polar centre angle2 c)) ) (if foyer2 (progn (princ "\nFoyer 1 : ") (princ foyer1) (princ "\nFoyer 2 : ") (princ foyer2) )) (princ) ) L'avantage du Cond est de pouvoir envoyer des messages explicites aux bons endroits. Serge
-
gile, On peut utiliser les conversions d'espace via trans. Et comme le disait si bien Bonuscad, ceci retourne le centroïde en terme de WCS (SCG) (trans (vlax-safearray->list (vlax-variant-value (vla-get-centroid (vlax-ename->vla-object (car (entsel)))))) 1 0) Et je ne cherche pas toujours à réduire le nombre de lignes de code, ça dépend du contexte :-)) L'instruction ci-haut planterait si on ne choisit rien ou si c'est un objet incompatible. Serge
-
zebulon_, J'ai parlé à Chad Wanless, le créateur de ce produit, en 2001, lors du Autodesk University. Nous avions des préoccupations communes ainsi que d'être Canadien (c'est rare que je le dis) et d'avoir un logiciel tellement évident pour l'usager qu'Autodesk allait le compétitionner. Cela crée un effet de ralentissement des ventes. Depuis 2001, toujours pas de ObjectDCL ni de MVPort dans AutoCAD. Autodesk investit ses énergies dans .Net (lire DotNet) comme plateforme de développement. Note: le MVPort a effectivement passé à un cheveu d'être incorporé à AutoCAD. C'est un outil qui facilite dramatiquement l'usage de l'espace papier. Une version gratuite existe pour AutoCAD 2000 à 2002 et une version d'évaluation 90 jours existe pour les versions suivantes. Serge
-
Patrick, C'est quoi cet événement ? Je viens de financer mon voyage :-) Serge
-
embat74, Je ne suis pas sur que le remède corresponde au symptome. D'abord, pour créer une commande, c'est facile en Lisp l'instruction defun. Voici la commande Test (defun c:test () (alert "Hello Wolrd !") (princ) ) Ensuite, dans le BeginCommand, tu peux évaluer si la variable système CMDACTIVE vaut 0, si oui tu affiche ce message "Vous devriez utiliser ma routine", sinon tu laisse porter. Je ne suis pas sur qu'en supprimant une commande tu te fasse des amis, surtout si ton client utilise d'autres routines qui elles lancent ces commandes. En dernier lieu, tu pourrais toujours annuler la définition de la commande via la commande NONDEF (_UNDEFINE). Par exemple NONDEF ZOOM. Serge
-
C\'est Serge qui va êt\' content !
Serge a répondu à un(e) sujet de Tramber dans AutoCAD 2000 à 2002
Bertrand, J'avoue être un peu gêné. Je connais Dominique et les cahier d'AutoCAD mais pas Cad-Magazine. Effectivement, le fait de tout rendre public et l'abonnement, c'est un exemple d'oxymore , à moins qu'il n'y ait de la pub. Serge -
Sujet épineux : les régions et les polylignes
Serge a répondu à un(e) sujet de Titifonky dans Routines LISP
Titifonky, Pas de quoi. Tu peux corriger cela: (command "pedit" "m" ss "" "o" "j" "" "") en (command "_pedit" "_multiple" ss "" "_yes" "_join" "" "") Ça se lit mieux que des abbréviations (mis à part les termes anglais). Serge -
ghis3, ObjectArx est gratuit (je ne sais pas si Autodesk va te forcer à être membre de ADN). Ce qui coute cher est l'outil de programmation. Pour l'instant, tu peux prendre Visual Studio 2002 (VS) ou 2003. Microsoft va sortir son 2005 bientôt. Le cout de VS est d'au moins 1500 euros. Il faut compter la courbe d'apprentissage qui est très raide pour 99% des gens. Tant qu'à faire un choix de ce genre, je conseillerais les langages de DotNet (managés) tels que VB et C#. Serge
-
Sujet épineux : les régions et les polylignes
Serge a répondu à un(e) sujet de Titifonky dans Routines LISP
Titifunky, Je ne sais pas si tu connais la variable HPBOUND ni l'aboutissement de ton programme. Cependant, voici quelques corrections [ le mélange de (command), de (entmake) et de (vla-*) donne de mauvais résultats si on compile en fas ou vlx). (defun c:pf () (setq cmde (getvar "CMDECHO") hp (getvar "HPBOUND") snap (getvar "AUTOSNAP") ) ;_ Fin de setq (setvar "CMDECHO" 0) (setvar "HPBOUND" 0) (setvar "AUTOSNAP" 2) (setq list_ent 'nil) ;; création des régions (setq repere (entlast)) (initget 1) (setq point (getpoint "\nMontrez le point interne: ")) (command "_.-boundary" point "") (setq derent (list (entlast))) (setq list_ent (append derent list_ent)) ;; mise en surbrillance des régions (foreach x list_ent (redraw x 1)) ;;;(mapcar ;;;'(lambda (x) ;;;(vlax-invoke-method (vlax-ename->vla-object x) 'highlight 1) ;;;) ;_ Fin de lambda ;;;list_ent ;;;) ;_ Fin de mapcar ;;;) ;_ Fin de while ;; annulations de la mise en surbrillance des régions (foreach x list_ent (redraw x 1)) ;;;(mapcar ;;;'(lambda (x) ;;;(vlax-invoke-method (vlax-ename->vla-object x) 'highlight 0) ;;;) ;_ Fin de lambda ;;;list_ent ;;;) ;_ Fin de mapcar ;; recupération du numero de la dernière entitée crée (princ (entlast)) ;; union des régions (setq ss (ssadd)) (foreach x list_ent (ssadd x ss)) (if (and ss (> (sslength ss) 1)) (command "._union" ss "")) (if (/= repere (entlast)) (progn (setq ss (ssadd)) (setq repere (entlast)) (command "._explode" (entlast) "") (setq x (entnext repere)) (while x (setq ss (ssadd x ss) x (entnext x))) (if ss (progn (princ (strcat "\nIl y a " (itoa (if ss (sslength ss) 0)) " objet(s) décomposé(s)")) (princ "\nLes voici bouger") (command "._move" ss "" point pause) ) (progn (princ "\nRaté !") )) )) ;;;(eval (append '(command "union") list_ent)) ;; recupération du numero de la dernière entitée crée ;;;(princ (entlast)) ;; le numéro de cette entité correspond au numéro récupéré avant la commande union !!!!!! (setvar "CMDECHO" cmde) (setvar "HPBOUND" hp) (setvar "AUTOSNAP" snap) (princ) ) ;_ Fin de defun Serge -
C\'est Serge qui va êt\' content !
Serge a répondu à un(e) sujet de Tramber dans AutoCAD 2000 à 2002
Tramber, J'ai des antennes faut croire :-) En passant, on compte dormir à Thionville le 27 juin et le lendemain à Koblenz. Le prochain passage en France sera le 17 juillet à Lyon, siège social de notre hôte. Serge PS : Cad magazine -> lequel ? J'ai fait une recherche et j'ai trouvé cadmagazine.net mais je doute que ce soit cela, en tout cas, je n'ai rien vu. Cadalyst ? [Edité le 6/6/2005 par Serge] -
alf_ze_cat, Je n'ai pas trouvé quelque chose de brillant et je suis sur que c'est très simple. L'historique est conservé dans des fichiers binaires nommés index.dat. Via 2 batch files, j'ai au moins réussi à les énumérer un a un (variante de Maximilien). Il reste à trouver l'éditeur de ces fichiers. ---------------------------------- Rem Depart.bat if %os%==Windows_NT goto NT goto WIN98 :NT for /d %%a in ("C:\Documents and Settings\%username%\Local Settings\Historique\History.Ie5\*.*") do call info "%%a" for /d %%a in ("C:\Documents and Settings\%username%\Local Settings\Historique\History.Ie5\*.*") do echo %%a >> c:\test.txt goto end : WIN98 REM Je n'ai pas Windows 98 alors il faudra adapter for /d %%a in ("C:\Documents and Settings\%username%\Local Settings\Historique\History.Ie5\*.*") do call info "%%a" for /d %%a in ("C:\Documents and Settings\%username%\Local Settings\Historique\History.Ie5\*.*") do echo %%a >> c:\test.txt goto end :end ---------------------------------- Rem Info.bat cd %1 rem À défaut d'un vrai lecteur de fichier index.bat, on peut au moins le repérer. rem MonFreeWare.exe index.bat dir index.dat >> c:\info.txt ---------------------------------- Serge
-
Patrick, Bon truc. Il y a aussi -Wbloc (_-wblock) et l'option =. Serge
-
chti52, Puisque tu débutes en Lisp, je vais te suggérer 2 techniques simples: (setq deltaZ 100.0) ; en supposant que tu as calculé cette valeur toi même (setq pt1 (list 0.0 0.0 0.0)) (setq pt2 (list 0.0 0.0 deltaZ) (setq ss (ssget)) ; Pour sélectionner (if ss (command "._move" ss "" "_none" pt1 "_none" pt2)) ; Déplacement relatif ;; ou encore (if ss (command "_change" ss "" "_properties" "_elev" deltaZ "") ; Déplacement absolu Si tu essaie d'y aller avec plus de raffinement, tu devra traiter un à un tes objets et les traiter spécifiquement. Par exemple, une ligne nécessite de modifier 2 codes (pt de départ et d'arrivée), un cercle a un code (le pt centre), une polyligne a plusieurs codes (et c'est assez complexe). En espérant t'avoir éclairer. Serge
-
J'oubliais ... Lorqu'on efface un Layout, les objets qui sont dessus ne sont pas effacés. Seulement, leur code 410 disparait (ce sont des objets sans propriétaires). Ils seront détruits en quittant le dessin avec sauvegarde (mais pas avant).. Pour ce qui est de ne pas réagir au changement de layout, il y a beaucoup de précautions à prendre et je ne suis pas sur que ça marche tout le temps vu qu'AutoCAD fait ses notifications aux réacteurs de façon aléatoire. Et comme je ne sais pas lire, je n'avais pas vu que c'était un sujet en VBA. Malheureusement, VBA ne peut lire un objet effacé. Seule technique envisageable est un COM Wrapper (appel à une routine en C++) Dim deletedObj As AcadObject ' NON -> Set deletedObj = ThisDrawing.ObjectIdToObject(ObjectID) Serge [Edité le 13/5/2005 par Serge]
-
Pako, En effet, ça faisait logtemps. Merci du mot de bienvenue. Pour le conseil, c'était pour Patrick. Patrick, Est-ce en VBA ou en Lisp ? La solution n'est pas la même. Serge
-
oops, Encore ces smileys.. La première ligne se lit comme suit: (defun c:offset2 et c'était destiné à Patric05. Serge (Je vais aller me traire une vache) [Edité le 13/5/2005 par Serge]
-
Oli553, Il suffit d'acheter la 2006, ou encore ceci: Remplacer les .... par des espaces) (defun c:offset2 ( .. / layer newObject newObjectGet oldObject ....) ....(setq layer (getstring "\nNom du calque de destination : ")) ....(if (= "" layer) (setq layer (getvar "clayer"))) ....(if (tblsearch "layer" layer) ....(progn ........(command "._offset" pause) ;; Demander le décalage ........(while (setq oldObject (entsel "\nSelectionez l'objet à décaler: ")) ............(command oldObject pause) ; Demander de quel coté ............(setq newObject (entlast)) ............(setq newObjectGet (entget newObject)) ............(setq newObjectGet (subst (cons 8 layer) (assoc 8 newObjectGet) newObjectGet)) ............(entmod newObjectGet) ............(entupd newObject) ........) ........(command "") ....) ....(progn ........(princ "\nCe calque n'existe pas.") ....)) ....(princ) ) Serge, le gars de la campagne
-
Sélection d\'attributs
Serge a répondu à un(e) sujet de Patrick_35 dans Pour aller plus loin en LISP
Patrick_35, Je trouve un peu compliqué de passer par du vla pour la sélection. Néanmoins, le problème réel que tu as à rencontrer est d'afficher la boite de dialogue plutôt que l'ancienne commande -attedit sur la ligne de commande. Pour ce faire, il y a l'instrucyion (initdia). Remplace les ... par des espaces. (defun c:mattedit ( ../ filtre i mode n ss ....) ....(initget "Tout Sélection") ....(setq mode (getkword "\nExtraction de blocs avec attributs [Tout/Sélection] : ")) ....(setq filtre (list (cons 0 "insert") (cons 66 1))) ....(if (= "Sélection" mode) ........(setq ss (ssget filtre)) ........(setq ss (ssget "_x" filtre)) ....) ....(setq i 0 n (if ss (sslength ss) 0)) ....(while (< i n) ........(initdia) ........(command "._attedit" (ssname ss i)) ........(setq i (1+ i)) ....) ....(cond ........((= n 0) (princ "\nAucun bloc avec attribut sélectionné.")) ........((= n 1) (princ "\nUn bloc avec attribut sélectionné.")) ........(t (princ (strcat (itoa n) " blocs avec attribut sélectionnés."))) ....) ....(princ) ) Serge, le gars de la campagne -
Patrick, Pour le code de Pako, il faut l'insérer dans la fenêtre de ThisDrawing et non pas dans un module. Le passge d'un Layout à l'autre sera également capté par ce réacteur. En quel langage ce réacteur ? Lisp ou VBA ? En passant, ça se fait, le MVPort le fait. On affiche le nom de la présentation parente comme info-bulle, donc on capte s'il est renommé ou s'il est effacé. Pour ce qui est de détecter les objets effacés via un réacteur en Lisp, c'est très difficile. En VBA, il y a le ObjectErased Exemple (à copier aussi dans la portion AcadDocument de ThisDrawing) : Private Sub AcadDocument_ObjectErased(ByVal ObjectID As Long) ....' This example intercepts a drawing ObjectErased event. ....' ....' This event is triggered when an object is removed from a drawing. ....' ....' To trigger this example event: Delete (Cut) an existing object from an open drawing ....' Use the "Object" variable to determine the type of object removed ....MsgBox "The ID of the object deleted is: " & ObjectID End Sub Serge
-
cadpolo, On conserve 3 données: x,y et z. Le tableau commence às l'indice 0. C'est le pourquoi de la boucle de 0 à 2. Vertices signifi sommets en anglais. Puisqu'on a le point de départ, on place sommets=1 Le message d'erreur est pour getpoint. Si tu veux arrêter de saisir des points, tu tapes Enter, ce qui cause l'erreur. C'est bête du VBA. Preserve vertexList(UBound(vertexList) + 3) signifie que j'augmente la taille du tableau pour acceuillir le nouveau triplet x,y et z tout en conservant les valeurs initiales. For i = 0 To 2: vertexList(UBound(vertexList) - 2 + i) = returnPnt(i): Next i signifie de placer le x dans l'avant-avant-dernière position du tableau, le y dans l'avant-dernière position puis le z à la dernière. vertices = vertices + 1 signifie qu'il y a un sommet de plus. Et pour finir, mais je n'ai pas vérifié dernièrement, si tu veux utiliser un style de mline en particulier, tu peux faire une recherche dans les dictionnaires du dessin puis l'activer s'il s'y trouve. Le problème est lorsque le style n'y est pas. À l'époque de la R13, j'avais contourné le problème en insérant un dessin vide qui ne contenaiit que mes styles. Aujourd'hui, il y a peut-être mieux, mais j'en doute. J'ai l'impression qu'Autodesk ne veux pas investir dans le concept du mline (ils ont voulu imiter Micro-Station sans plus). Serge
-
Ludwig, Si tu veux absolument passer par des command et que le résultat est trop lent, soit. Tu peux aussi dessiner ces objets à l'extérieur de la zone visible puis les déplacer ou encore te créer un calque invisible (_off) puis le rendre visible. Serge
-
cadpolo, Si j'avais su que j'allais frapper un mur à ma 300-ième intervention ... Néanmoins, voici une porte de sortie : (remplacer les .... par des espaces) Sub Example_AddMLine() ....' This example adds an Mline in model space .... ....Dim mLineObj As AcadMLine ....Dim returnPnt As Variant ....Dim i As Integer ....Dim vertices As Integer .... ....returnPnt = ThisDrawing.Utility.GetPoint(, "Entrez le point de départ: ") ....Dim vertexList() As Double ....ReDim Preserve vertexList(2) ....For i = 0 To 2: vertexList(i) = returnPnt(i): Next i ....vertices = 1 .... ....On Error Resume Next ....Do ........returnPnt = ThisDrawing.Utility.GetPoint(returnPnt, "Entrez le point suivant: ") ........If Err.Number = 0 Then ............ReDim Preserve vertexList(UBound(vertexList) + 3) ............For i = 0 To 2: vertexList(UBound(vertexList) - 2 + i) = returnPnt(i): Next i ............vertices = vertices + 1 ........Else ............Err.Clear ............Exit Do ........End If ....Loop ....' Create the line in model space ....Set mLineObj = ThisDrawing.ModelSpace.AddMLine(vertexList) End Sub Serge
