Jump to content

Thomas W

Member
  • Posts

    102
  • Joined

  • Last visited

Everything posted by Thomas W

  1. Hi everyone, I was looking for a way to update the symbols of one (or more) file with respect to another file which contains the updated symbols of the same name. After getting stuck on ImportResToCurFileN I came up with something that seems to work and should work for other objects besides symbols as well. Principle of operation: - create 1 list of the desired object type in each file. - compare the 2 lists and when 2 symbol names are identical propose to replace, rename or do nothing. Below is the script that works in my case: Bonjour à tous, Je cherchais le moyen de mettre à jour les symboles d'un (ou plusieurs) fichier par rapport à un autre fichier qui contient les symboles à jours du même nom. Après avoir bloqué sur ImportResToCurFileN je suis arrivé à quelque chose qui semble fonctionner et qui devrait aussi fonctionner pour d'autres objets que les symboles. Principe du fonctionnement : - créer 1 liste du type d'objet souhaité dans chaque fichier. - comparer les 2 listes et lorsque 2 noms de symboles sont identiques proposer de remplacer, renommer ou ne rien faire. Ci-dessous le script qui fonctionne dans mon cas : PROCEDURE Compar2DifferentLists; {$DEBUG} CONST ObjectType=16; { Symbol Definition } CR=Chr(13); fullPath='Chemin du fichier.vwx qui contient les symboles à jour'; VAR I1, I2, NumItems1, NumItems2, CheckedSymbols: INTEGER; rowStart, rowEnd, columnStart, columnEnd: INTEGER; ListID1, ListID2: LONGINT; S1, S2: STRING; SymNameLocal, SymNameMaster: DYNARRAY OF STRING; h1, h2: HANDLE; FUNCTION Execute(h1: HANDLE): BOOLEAN; BEGIN IF (h1<>NIL) & (CheckedSymbols<=NumItems1) THEN BEGIN S1:= SymNameLocal[CheckedSymbols]; FOR I2:=1 TO NumItems2 DO IF S1= GetNameFromResourceList(ListID2, I2) THEN BEGIN S2:= GetNameFromResourceList(ListID2, I2); AlrtDialog(Concat('SymNameLocal', '[', CheckedSymbols, ']', ': ', S1, CR, 'SymNameMaster qui a le même nom est celui avec l''Index', '[', I2, ']', ' de la ListID2: ', ListID2, CR, 'Soit SymNameMaster', '[', I2,']', ': ', (S2))); h2:= ImportResourceToCurrentFile(ListID2, I2); END; CheckedSymbols:= CheckedSymbols+1; END; END; BEGIN ListID1:= BuildResourceList(ObjectType, 0, '', NumItems1); ListID2:= BuildResourceListN(ObjectType, fullPath, NumItems2); ALLOCATE SymNameLocal[1..NumItems1]; CheckedSymbols:=1; FOR I1:=1 TO NumItems1 DO SymNameLocal[I1]:= GetActualNameFromResourceList(ListID1, I1); SortArray(SymNameLocal, 1, NumItems1); GetArrayDimensions(SymNameLocal, rowStart, rowEnd, columnStart, columnEnd); AlrtDialog(Concat('SymNameLocal n°1: ', SymNameLocal[1], CR, 'Dernier SymNameLocal n°', NumItems1, ': ', SymNameLocal[NumItems1])); ALLOCATE SymNameMaster[1..NumItems2]; FOR I2:=1 TO NumItems2 DO SymNameMaster[I2]:= GetActualNameFromResourceList(ListID2, I2); SortArray(SymNameMaster, 1, NumItems2); GetArrayDimensions(SymNameMaster, rowStart, rowEnd, columnStart, columnEnd); AlrtDialog(Concat('SymNameMaster n°1: ', SymNameMaster[1], CR, 'Dernier SymNameMaster n°', NumItems2, ': ', SymNameMaster[NumItems2])); ForEachObjectInList(Execute, 0, 2, FSymDef); END; Run(Compar2DifferentLists); Your remarks will be welcome and I had trouble with the beginning of the Function Execute script because I was trying to make it work with WHILE rather than with IF, could we replace "IF (h1 < >NIL) & (CheckedSymbols<=NumItems1) THEN BEGIN" with a WHILE? Thank you for the previous exchanges which allowed me to move forward. Below 2 screenshots of the result : and after the script Have a good day, Thomas Vos remarques seront bien venus et j'avais du mal avec le début du script de la Function Execute parce que je cherchais à le faire fonctionner avec WHILE plutôt que avec IF, est ce que dans ce ca là on pourrait remplacer "IF (h1<>NIL) & (CheckedSymbols<=NumItems1) THEN BEGIN" par une boucle WHILE? Merci pour les échanges précédents qui m'ont permis d'avancer. Bonne journée, Thomas
  2. Thanks to both of you for your feedback and explanations. @Pat Stanford: yes I was expecting a callback to choose different options! (but I'm doing other tests, I'll do another post depending on the results...) See you soon and have a nice day, Thomas Merci à vous 2 pour vos retours et vos explications. @Pat Stanford: oui je m'attendais à un rappel permettant de choisir différentes options! (mais je suis entrain de faire d'autres tests, je ferai un autre post suivant les résultats...) A bientôt et bonne journée, Thomas
  3. Hello everyone and thank you Lada for your feedback, I retested ImportResToCurFileN in a blank file by creating a list of symbols from our shared library whose path is in User Folder/Shared Preference Folders: resList := BuildResourceList(16, -14, '', numRes ) Then when importing with index #1: h:= ImportResToCurFileN( resList , 1, ImportResCallback ) the symbol with index 1 is imported into the blank file, with no message. If I run it a second time nothing happens. On the other hand, if I modify the imported symbol and run the script, it imports the symbol and renames it with '-1' as specified in the Function. If I understood correctly when there is a conflict, the callback used will be the one defined in the function, in the case below it will be rename. And if we want to use Replace, we should configure it in the same way in the Function ImportResCallback? I was expecting something different from the description on developer.vectorworks.net, I thought you could choose for each conflict between Do nothing, Replace or Rename. Thank you for your feedback which prompted me to test again and see that it works in some cases, even if I find it does not correspond too much to the description on the site! I had a return from the .eu hotline saying that they had reported the problem to Vectorworks inc. but that they did not know when a solution might be available. Have a good day, Bonjour à tous et merci Lada pour votre retour, J'ai re testé ImportResToCurFileN dans un fichier vierge en créant une liste des symboles de notre bibliothèque partagée dont le chemin est dans Dossier Utilisateur/ Dossiers de préférences partagés : resList := BuildResourceList(16, -14, '', numRes ) Puis lors de l'import avec l'index n°1 : h := ImportResToCurFileN( resList , 1, ImportResCallback ) le symbole dont l'index est 1 est importé dans le fichier vierge, sans message. Si je l'exécute une 2ème fois rien ne se passe. Par contre si je modifie le symbole importé et que j'exécute le script il importe le symbole et le renomme avec '-1' comme précisé dans la Fonction. Si j'ai bien compris lorsqu'il y a un conflit le callback utilisé sera celui définit dans la function, dans le cas ci-dessous ce sera renommer. Et si on veut utiliser Remplacer il faudrait le paramétrer de la même manière dans la Function ImportResCallback? Je m'attendais à un autre fonctionnement d'après la description sur le site developer.vectorworks.net, je pensais qu'on pouvait le choix pour chaque conflit entre Ne rien faire, Remplacer ou Renommer. Merci de votre retour qui m'a poussé à re tester et à voir que ça fonctionne dans certains cas, même si je trouve ça ne correspond pas trop à la description sur le site! J'avais eu un retour de la hotline .eu disant qu'ils avaient reporté le problème auprès de Vectorworks inc. mais qu'ils ne savaient pas quand une solution pourrait être disponible. Bonne journée, PROCEDURE testResCountSymFolders; {$DEBUG} VAR resList : LONGINT; numRes : INTEGER; h : HANDLE; FUNCTION ImportResCallback(VAR resourceName:DYNARRAY OF CHAR) : INTEGER; BEGIN AlrtDialog( resourceName ); resourceName := Concat( resourceName , '-1' ); ImportResCallback := 2; END; BEGIN { list symbol folders in curr doc } resList := BuildResourceList(16, -14, '', numRes ); h := ImportResToCurFileN( resList , 1, ImportResCallback ); alrtDialog(concat('numRes=', numRes , ' h=', h)); END; RUN(testResCountSymFolders);
  4. @Conrad Preen Hello and thank you for your feedback and your explanations! I will try again ImportResToCurFileN with callback in Function and not in procedure, following your explanations. As for Vectorscript, I became interested about 2 months ago for certain operations inaccessible without script. I haven't done any development before, so I looked at vectorscripts and scripts in python, then reading some posts and help I tested some help examples. I find the code interesting but even if it's a profession in its own right, nothing prevents you from being so interested in having notions. Previously I used Allplan for 17 years, Archicad for 4 years, Revit for 6 months, then Vector now. I'm going to read the information I find in the help on these different languages and maybe one of these days I'll get a corny thrill like no other! Have a nice day and all my best wishes! Thomas Bonjour et merci pour votre retour et vos explications! Je vais réessayer ImportResToCurFileN avec callback en Fonction et pas en procédure, en suivant vos explications. Pour ce qui est de Vectorscript je mis suis intéressé il y à 2 mois environ pour certaines opérations inaccessible sans script. Je n'ai pas fait de développement avant, donc j'ai regardé les vectorscripts et les scripts en python, puis en lisant certains posts et l'aide j'ai testé certains exemples de l'aide. Je trouve le code intéressant mais même si c'est un métier à part entière rien n'empêche de si intéresser pour avoir des notions. Auparavant j'ai utiliser Allplan pendant 17ans, Archicad pendant 4ans, Revit pendant 6 mois, puis maintenant Vector. Je vais lire les informations que je trouve dans l'aide sur ces différents langages et peut être qu'un des ces jours j'aurais un frisson ringard sans pareil! Bonne journée et tous mes meilleurs voeux! Thomas
  5. @Pat Stanford Well I think I was unlucky on this one! But thank you for your return which avoids me to search too long. It would be good if they modified these explanations on the Dev site and on the local file, I will also send an email to the hotline in this direction. Anyway thank you and I'll look for another solution for what I want to achieve and I'll do another post I think. Thank you and good day Bon je crois que je n'ai pas eu de chance sur ce coup là! Mais merci de votre retour qui m'évite de chercher trop longtemps. Ce serait bien qu'ils modifient ces explications sur le site Dev et sur le fichier en local, je vais également faire un mail à la hotline dans ce sens. En tous cas merci et je vais chercher une autre solution pour ce que je souhaite réaliser et je ferais un autre poste je pense. Merci et bonne journée
  6. Hello Pat, I did several tries and searched for examples of ResList_ImportItemN but couldn't come up with a choice when conflicting. For me the uniqueID is the unique name of the item to import and doConflict would be the choice when conflicting. FUNCTION ResList_ImportItemN(uniqueID: STRING; doConflict: LONGINT): HANDLE; Below is the code I tried to test, but it doesn't work as described: If you see what the problem is I'm interested! The file is attached. Thanks and good day, Bonjour Pat, J'ai fait plusieurs essais et recherché des exemples de ResList_ImportItemN mais je ne suis pas arrivé à avoir un choix lors de conflit. Pour moi l'uniqueID est le nom unique de l'élément à importer et doConflict serait le choix lors de conflit. FUNCTION ResList_ImportItemN( uniqueID : STRING ; doConflict : LONGINT ) : HANDLE ; Ci-dessous le code que j'ai essayé pour tester, mais qui ne fonctionne pas comme dans la description : Si vous voyez ce qui pose problème ça m'intéresse! Le fichier est en pièce jointe. Merci et bonne journée, PROCEDURE testResList_ImportItemN; {$DEBUG} {FUNCTION ResList_ImportItemN( uniqueID :STRING; doConflict :LONGINT) : HANDLE;} CONST ObjectType=16; { Symbol Definition } FolderIndex=14; {si -14 ne va chercher que dans le dossier de symbol par défaut et du coup ne peut pas vérifier si hatch=NIL,} {sauf en faisant une liste en plus qui ne concerne que le document } {Préférence Vector, dossier utilisateurs, dossier partagé} SubFolderName=''; { Nul subfolder get all folders and subfolders } doConflict=2; VAR uniqueID: STRING; MyName: STRING; MyList: LONGINT; NumItems: LONGINT; hatch: HANDLE; BEGIN MyList:= BuildResourceList(ObjectType, FolderIndex, '', NumItems); MyName:= GetNameFromResourceList(MyList, 5); { change this number to get the names of other symbol } AlrtDialog( Concat(Date(2, 2), Chr(13), 'The Name is: ', MyName, Chr(13), 'Total items in list: ', NumItems)); {IF (hatch= NIL) THEN} hatch:= ResList_ImportItemN(MyName, doConflict); {hatch:= ImportResourceToCurrentFile(MyList, 5);} DeleteResourceFromList(MyList, 5); END; RUN(testResList_ImportItemN);
  7. Hello Pat, Thank you for your feedback, I've been stuck on this function for a while now, so somewhere it reassures me! I'll check out the ResList_ImportItemN function and let you know if I got it to work. Thanks again and have a nice day Bonjour Pat, Merci de votre retour, ça fait un moment que je bloque sur cette fonction donc quelque part ça me rassure! Je vais voir avec la fonction ResList_ImportItemN et je vous dirais si je suis arrivé à la faire fonctionner. Merci encore et bonne journée
  8. Hello and all my best wishes for this new year! I'm trying to figure out how the ImportResToCurFileN function works. According to the explanation of the help, we should be able to choose between Don't import, replace or rename? I tried based on the helper script but when importing an already existing symbol, I can't seem to make this choice appear. The example below is from the help, is it supposed to work or is something missing? : Bonjour et tous mes meilleurs vœux pour cette nouvelle année! Je cherche à comprendre comment fonctionne la fonction ImportResToCurFileN. D'après l'explication de l'aide lors de conflit on devrait pouvoir choisir entre DoNotImport, Replace ou Rename? J'ai essayé en me basant sur le script de l'aide mais lors de l'import d'un symbole déjà existant je n'arrive pas à faire apparaître ce choix. L'exemple ci-dessous vient de l'aide, est-il censé fonctionner ou il manque quelque chose? : https://developer.vectorworks.net/index.php/VS:ImportResToCurFileN PROCEDURE testResCountSymFolders; VAR resList : LONGINT; numRes : INTEGER; h : HANDLE; FUNCTION ImportResCallback(VAR resourceName:DYNARRAY OF CHAR) : INTEGER; BEGIN AlrtDialog( resourceName ); resourceName := Concat( resourceName , '-1' ); ImportResCallback := 2; END; BEGIN { list symbol folders in curr doc } resList := BuildResourceList(16, 23, '', numRes ); h := ImportResToCurFileN( resList , 1, ImportResCallback ); alrtDialog(concat('numRes=', numRes , ' h=', h)); END; RUN(testResCountSymFolders); Thanks in advance and have a nice day! Merci d'avance et bonne journée!
  9. Hello and all my best wishes for this new year! I'm trying to figure out how the ImportResToCurFileN function works. According to the explanation of the help, we should be able to choose between Don't import, replace or rename? I tried based on the helper script but when importing an already existing symbol, I can't seem to make this choice appear. The example below is from the help, is it supposed to work or is something missing? : Bonjour et tous mes meilleurs vœux pour cette nouvelle année! Je cherche à comprendre comment fonctionne la fonction ImportResToCurFileN. D'après l'explication de l'aide lors de conflit on devrait pouvoir choisir entre DoNotImport, Replace ou Rename? J'ai essayé en me basant sur le script de l'aide mais lors de l'import d'un symbole déjà existant je n'arrive pas à faire apparaître ce choix. L'exemple ci-dessous vient de l'aide, est-il censé fonctionner ou il manque quelque chose? : https://developer.vectorworks.net/index.php/VS:ImportResToCurFileN PROCEDURE testResCountSymFolders; VAR resList : LONGINT; numRes : INTEGER; h : HANDLE; FUNCTION ImportResCallback(VAR resourceName:DYNARRAY OF CHAR) : INTEGER; BEGIN AlrtDialog( resourceName ); resourceName := Concat( resourceName , '-1' ); ImportResCallback := 2; END; BEGIN { list symbol folders in curr doc } resList := BuildResourceList(16, 23, '', numRes ); h := ImportResToCurFileN( resList , 1, ImportResCallback ); alrtDialog(concat('numRes=', numRes , ' h=', h)); END; RUN(testResCountSymFolders); Thanks in advance and have a nice day! Merci d'avance et bonne journée!
  10. Hi all, The vectorscripts and codes are new to me but bring an interesting and complementary vision to the different possibilities! We work with 1 basic file which contains about 15 modules then we have 15 separate files for the manufacture of each module. I'm looking for the best way to keep all elements of these 15 files up to date with the base file (symbols, database format, labels...). So I searched in VS:Function_Reference and tested some scripts like BuildResourceList, BuildResourceListN, GetNameFromResourceList, ImportResourceToCurrentFile, Name2Index... The 1st objective would be to replace from an open file the elements present in this open file by the elements of the same name of the base file. The 2nd objective, if it is feasible, would be to replace the elements of several files which are each in different folders, by the elements of the same name of the base file. I did several tests but I have trouble with certain functions or loops. I manage to make a list of the open file and a closed file by indicating the path, to import a symbol according to its name, to find its index according to its name, but I can't get it all to work whole. Since I couldn't get the Procedure CallBack from VS:ImportResToCurFileN to work I tried another way, if anyone has an explanation or another example than how to help the Callback function I want Well! Below is a test script and the file attached: Salut à tous, Les vectorscripts et les codes sont nouveaux pour moi mais apportent une vision intéressante et complémentaire aux différentes possibilités! Nous travaillons avec 1 fichier de base qui contient environ 15 modules puis nous avons 15 fichiers à part pour la fabrication de chaque modules. Je cherche le meilleur moyen de garder tous les éléments de ces 15 fichiers à jour par rapport au fichier de base (symboles, format de base de données, étiquettes...). J'ai donc cherché dans VS:Function_Reference et j'ai testé certains scripts comme BuildResourceList, BuildResourceListN, GetNameFromResourceList, ImportResourceToCurrentFile, Name2Index... Le 1er objectif serait de remplacer à partir d'un fichier ouvert les éléments présents dans ce fichier ouvert par les éléments de même nom du fichier de base. Le 2ème objectif, si c'est réalisable, serait de remplacer les éléments de plusieurs fichiers qui sont chacun dans des dossiers différents, par les éléments de même nom du fichier de base. J'ai fait plusieurs tests mais j'ai du mal avec certaines fonctions ou certaines boucles. J'arrive à faire une liste du fichier ouvert et d'un fichier fermé en indiquant le chemin, à importer un symbole suivant son nom, à trouver son index en fonction de son nom, mais je n'arrive pas à faire fonctionner le tout ensemble. Vu que je ne suis pas arriver à faire fonctionner la Procedure CallBack de VS:ImportResToCurFileN j'ai essayé d'une autre manière, si quelqu'un à une explication ou un autre exemple que celle de l'aide de la fonction Callback je veux bien! Ci-dessous un test de script et le fichier en pièce jointe : VS11:BuildResListN_List vers ListN_modifs-FORUM PRESQUE OK-2 : PROCEDURE testGetNameFromRes; {$DEBUG} VAR resTypeN: INTEGER; fullPath: DYNARRAY[] OF CHAR; resListN, resList: LONGINT; numResN, numRes, i: INTEGER; S1: STRING; h: HANDLE; {numIndexN, numIndex: LONGINT;} {resourceName: DYNARRAY OF CHAR;} {Exists: BOOLEAN;} BEGIN resTypeN:=16; resList:=BuildResourceList(resTypeN, 0,'', numRes); AlrtDialog(CONCAT('Nombre d''éléments de la Liste=', numRes, Chr(13),'ID pour la Liste=', resList)); BEGIN FOR i:=1 TO numRes DO IF GetNameFromResourceList(resList, i)='My Symbol Name' THEN BEGIN AlrtDialog(CONCAT('Symbole déjà présent dans ce fichier')); END {ELSE AlrtDialog(CONCAT('Symbole non présent dans le fichier, on va l''importer du fichier source'));} END; fullPath:='Y:\Thomas\Vectorscript Exemple\TW VScript Create list of symbols in resources\TW_VS créer un rectangle_rectangleN_GetBBox_sur bureau COPIE.vwx'; resListN:=BuildResourceListN(resTypeN, fullPath, numResN); AlrtDialog(CONCAT('Nombre d''éléments de la ListeN=', numResN, Chr(13),'ID pour la ListeN=', resListN)); BEGIN FOR i:=1 TO numResN DO IF GetNameFromResourceList(resListN, i)='My Symbol Name' THEN h:=ImportResourceToCurrentFile(resListN, i); END; BEGIN IF GetObject('My Symbol Name')<>NIL THEN AlrtDialog(CONCAT('Symbole présent dans ce fichier')); END; END; RUN(testGetNameFromRes); Thank you and I hope the google translation will be understandable enough! Have a nice day and happy Christmas! Thomas Merci et j'espère que la traduction google sera assez compréhensible! Bonne journée et bonnes fêtes! Thomas TW test Create List Symbols and Import_Forum.vwx
  11. Thank you very much for those explanations! It helped me to make the data label below which contains a line which can be empty and one which will be in color according to the choice made: Merci beaucoup pour ces explications! Ca m'a aidé à faire l'étiquette de données ci-dessous qui contient une ligne qui peut être vide et une qui sera en couleur suivant le choix réalisé : The data label is divided into 3 label fields: the 1st part up to Line 4, the 2nd for Line 5 in red, the 3rd overlapping the 2nd for the text in black: L'étiquette de données est divisée en 3 champs d'étiquettes: la 1ère partie jusqu'à la Ligne 4, la 2ème pour Ligne 5 en rouge, la 3ème superposée à la 2ème pour le texte en noir : Attached is the .vwx file Thanks again Pat and have a nice day! Ci-joint le fichier .vwx Merci encore Pat et bonne journée! Etiquette de données sans ligne vide et ligne en Couleur_ok forum.vwx
  12. Thanks for your feedback Pat! It is indeed multiple colors in a data tag, so I will try with multiple stacked text objects and the IF statement, but I think it will be complicated because the data tag contains 8 or 9 lines depending cases, with the possibility of having a line that only displays in certain cases with an IF function. Can we put several conditions between the @ and the :? Like: #Door#.#Configuration#@(#Door#.#Configuration#='Folding' & #Door#.#Options"='Polystyrene'):'' Anyway thanks for the explanation of using the IF function in the data tag! I'll try and let you know if I get an acceptable result. Have a good day ! Merci pour ton retour Pat ! Il s'agit bien de plusieurs couleurs dans une balise de données, je vais donc essayer avec plusieurs objets de textes empilés et l'instruction IF, mais je pense que ça va être compliqué parce que la balise de données contient 8 ou 9 lignes selon les cas, avec la possibilité d'avoir une ligne qui ne s'affiche que dans certains cas avec une fonction IF. Peut on mettre plusieurs conditions entre le @ et le : ? Comme : #Porte#.#Configuration#@(#Porte#.#Configuration#='Pliante' & #Porte#.#Options"='Polystyrène'):'' En tous cas merci pour l'explication de l'utilisation de la fonction IF dans la balise de données ! Je vais essayer et je vous tiens au courant si j'arrive à un résultat acceptable. Bonne journée !
  13. Hi all, I'm trying to put colored text or part of text in a data label but I'm not sure how to do it. I first tried the GetPenFore and SetPenFore functions to see the result in Vectorscript but if I understood correctly these functions are not accessible in the DataTag. Apparently only array functions are accessible? (#WS_#) If someone has an idea to put some text in color in a data label it will be appreciated! Or a place to find information about #WS_# functions and how to use them, such as Vectorworks 2023 Script Function Reference. Below is a screenshot and an attached file with an example data label, Salut à tous, J'essaye de mettre du texte ou une partie de texte en couleur dans une étiquette de données mais je ne sais pas trop comment procéder. J'ai d'abord essayé les fonctions GetPenFore et SetPenFore pour voir le résultat en Vectorscript mais si j'ai bien compris ces fonctions ne sont pas accessibles dans les DataTag. Apparemment seuls les fonctions des tableaux sont accessibles? (#WS_#) Si quelqu'un à une idée pour mettre une partie de texte en couleur dans une étiquette de données il sera bienvenue! Ou un endroit ou trouver des informations sur les fonctions #WS_# et comment les utiliser, comme Vectorworks 2023 Script Function Reference. Ci-dessous une capture et un fichier joint avec un exemple d'étiquette de données, Merci et bonne journée, Thomas Etiquette de données sans ligne vide - une partie de ligne en Couleur.vwx
  14. Bonjour, Je n'ai pas encore essayé Marionette mais ça donne envie! Vous trouverez ci-joint un exemple de tableau qui récupère la largeur, la hauteur, la teinte et des options possibles de hauteur et de largeur. La somme des options pose un problème vu qu'elle viennent d'une liste déroulante mais après un export excel cela fonctionne. Fonctionne avec des rectangles, une base de données et une étiquette de données qui est liée au rectangle. Peut être que ça peut vous aider pour réaliser votre tableau. Fichier exemple en pièce jointe. Bonne journée! Hello, I haven't tried Marionette yet but it makes me want to! Attached is an example table that retrieves the width, height, tint and possible height and width options. The sum of the options poses a problem since it comes from a drop-down list but after an excel export it works. Works with rectangles, a database, and a data label that is bound to the rectangle. Maybe it can help you to make your table. Sample file attached. Have a good day! Thomas Exemple simple panneau de façade et tableau v2.vwx
  15. Bonjour, J'ai complété le script pour réaliser les étapes ci-dessous : - Sélectionner un rectangle qui servira de contour de sélection. - Nommer le rectangle. - Sélectionner ce qui est dans le rectangle, LOC recherche le centre des objets. - ForEachObject chercher les objets (qui ne sont pas des symboles) et qui ont au moins un point en dehors du rectangle, les désélectionner. - ForEachObject chercher les symboles non sélectionnés qui ont leur point d'insertion dans le rectangle. les sélectionner. - ForEachObject chercher les symboles sélectionnés qui ont leur point d'insertion en dehors du rectangle parmi ceux sélectionnés, les désélectionner. Il y aura certaines exceptions comme sur la capture ci-dessous mais ce sera acceptable pour notre utilisation. Hello, I completed the script to perform the steps below: - Select a rectangle that will serve as a selection outline. - Name the rectangle. - Select what is in the rectangle, LOC searches the center of objects. - ForEachObject find objects (which are not symbols) and which have at least one point outside the rectangle, deselect them. - ForEachObject find unselected symbols that have their insertion point in the rectangle. select them. - ForEachObject find the selected symbols which have their insertion point outside the rectangle among those selected, deselect them. There will be some exceptions as in the screenshot below but it will be acceptable for our use. Le script de cette sélection et le fichier en pièce jointe : PROCEDURE selectInRect; VAR Hd1 :HANDLE; X1,Y1,X2,Y2 :REAL; RectX1,RectY1,RectX2,RectY2 :REAL;{Rect Dims} PROCEDURE ObjectOutRect(Hd1:HANDLE);{chercher les objets (qui ne sont pas des symboles) et qui ont au moins un point en dehors du rectangle} BEGIN GetBBox(Hd1,X1,Y1,X2,Y2); IF((X1<RectX1) OR (X2>RectX2) OR (Y1>RectY1) OR (Y2<RectY2)) THEN SetDSelect(Hd1); END; PROCEDURE SymLocInRect(Hd1:HANDLE);{chercher les symboles non sélectionnés qui ont leur point d'insertion dans le rectangle} BEGIN GetSymLoc(Hd1,X1,Y1); IF(((X1>RectX1) AND (X1<RectX2)) AND ((Y1<RectY1) AND (Y1>RectY2))) THEN SetSelect(Hd1); END; PROCEDURE SymLocOutRect(Hd1:HANDLE);{chercher les symboles sélectionnés qui ont leur point d'insertion en dehors du rectangle parmi ceux sélectionnés} BEGIN GetSymLoc(Hd1,X1,Y1); IF(((X1<RectX1) OR (X1>RectX2)) OR ((Y1>RectY1) OR (Y1<RectY2))) THEN SetDSelect(Hd1); END; BEGIN Hd1 :=FSActLayer; IF FSActLayer = NIL THEN AlrtDialog('Selectionner un rectangle pour faire une sélection'); SetName(Hd1, 'MySelectionPolygon'); GetBBox(Hd1, RectX1, RectY1, RectX2, RectY2); Message('Coordonnées du rectangle',' RectX1=', RectX1,' RectY1=', RectY1,' RectX2=', RectX2,' RectY2=', RectY2); DSelectAll; SelectObj((NOTINDLVP & NOTINREFDLVP & (LOC='MySelectionPolygon'))); DelName('MySelectionPolygon'); ForEachObject(ObjectOutRect, ((NOTINDLVP & NOTINREFDLVP & ((VSEL=TRUE) & (T<>SYMBOL))))); ForEachObject(SymLocInRect,(NOTINDLVP & NOTINREFDLVP & ((VSEL=FALSE) & (T=SYMBOL)))); ForEachObject(SymLocOutRect,(NOTINDLVP & NOTINREFDLVP & ((VSEL=TRUE) & (T=SYMBOL)))); END; Run(selectInRect); Bonne journée et encore merci Pat pour les suggestions, Have a nice day and thanks again Pat for the suggestions, Thomas TW_VS créer un rectangle_rectangleN_GetBBox_sur bureau pour forum V2.vwx
  16. Bonjour, C'est ok le script ci-dessous fonctionne mais il y aura certainement des exceptions. Fonctionnement de base : Dans le dessin je sélectionne un rectangle et on souhaite récupérer tout ce qui est entièrement compris dans ce rectangle. Cela fonctionne pour l'instant pour des objets comme des lignes, des rectangles....mais ça risque de se compliquer avec les symboles 2d/3d et les symboles dans murs. C'est pour de la construction modulaire et l'objectif est d'attribuer un format de base de données à des modules qui sont rectangulaires et qui peuvent être accolés. Ci-dessous le script qui fonctionne pour les objets simples comme les lignes, rectangles... Hello, It's ok the script below works but there will definitely be exceptions. Basic operation: In the drawing I select a rectangle and we want to recover everything that is entirely included in this rectangle. It works for now for objects like lines, rectangles...but it may get complicated with 2d/3d symbols and wall symbols. It is for modular construction and the objective is to assign a database format to modules which are rectangular and which can be joined. Below is the script that works for simple objects like lines, rectangles... PROCEDURE selectInRect; VAR Hd1 :HANDLE; X1,Y1,X2,Y2 :REAL; RectX1,RectY1,RectX2,RectY2 :REAL;{Rect Dims} PROCEDURE Execute(Hd1:HANDLE); BEGIN GetBBox(Hd1,X1,Y1,X2,Y2); IF((X1<RectX1) OR (X2>RectX2) OR (Y1>RectY1) OR (Y2<RectY2)) THEN SetDSelect(Hd1); END; BEGIN Hd1 :=FSActLayer; IF FSActLayer = NIL THEN AlrtDialog('Selectionner un rectangle pour faire une sélection'); SetName(Hd1, 'MySelectionPolygon'); GetBBox(Hd1, RectX1, RectY1, RectX2, RectY2); Message('Coordonnées du rectangle',' RectX1=', RectX1,' RectY1=', RectY1,' RectX2=', RectX2,' RectY2=', RectY2); DSelectAll; SelectObj((NOTINDLVP & NOTINREFDLVP & (LOC='MySelectionPolygon'))); ForEachObject(Execute, ((VSEL=TRUE))); END; Run(selectInRect); Je vais tester pour les symboles 2d/3d et les symboles 2d/3d qui contiennent des symboles dans mur vu qu'ils réagissent différemment à la sélection et j'aurai sûrement d'autres questions. I'm going to test for 2d/3d symbols and 2d/3d symbols that contain wall symbols as they react differently to selection and I'm sure I'll have more questions. le fichier de cet exemple est ci-joint the file of this example is attached Merci à Pat et bonne journée, Thank you Pat and have a nice day, Thomas TW_VS créer un rectangle_rectangleN_GetBBox_sur bureau nettoyé pour forum.vwx
  17. Bonjour Pat, Je suis entrain de tester votre suggestion, mes différents tests se compilent mais je n'arrive pas au résultat souhaité pour l'instant. Soit c'est un problème d'ordre dans l'écriture, soit je n'ai pas donné les bonnes informations pour récupérer les coordonnées du Rectangle de sélection. Ci-dessous les scripts que j'ai essayé et le fichier .vwx est ci-joint. Si vous avez des pistes pour améliorer ce script je suis preneur! Merci et bonne journée, I'm testing your suggestion, my various tests are compiling but I can't get the desired result for now. Either it's a problem with the order in the writing, or I didn't give the right information to retrieve the coordinates of the Selection Rectangle. Below are the scripts I tried and the .vwx file is attached. If you have any ideas for improving this script, I'm all ears! Thank you and good day, Version 7 : PROCEDURE selectInRect; VAR Hd1 :HANDLE; RX1,RY1,RX2,RY2 :REAL; PROCEDURE Execute(Hd1:HANDLE); VAR X1,Y1,X2,Y2 :REAL; RX1,RY1,RX2,RY2 :REAL; BEGIN GetBBox(Hd1,X1,Y1,X2,Y2); IF((X1<RX1) OR (X2>RX2) OR (Y1>RY1) OR (Y2<RY2)) THEN SetDSelect(Hd1); END; BEGIN Hd1 :=FSActLayer; IF FSActLayer = NIL THEN AlrtDialog('Selectionner un rectangle pour faire une sélection'); SetName(Hd1, 'MySelectionPolygon'); GetBBox(Hd1, RX1, RY1, RX2, RY2); Message('Coordonnées du rectangle',' RX1=', RX1,' RY1=', RY1,' RX2=', RX2,' RY2=', RY2); DSelectAll; SelectObj((NOTINDLVP & NOTINREFDLVP & (LOC='MySelectionPolygon'))); ForEachObject(Execute, ((NOTINDLVP & NOTINREFDLVP & (VSEL=TRUE)))); END; Run(selectInRect); Et une autre version : And another version: Version 8 : PROCEDURE selectInRect; VAR Hd1 :HANDLE; X1,Y1,X2,Y2 :REAL; RX1,RY1,RX2,RY2 :REAL;{Rect Dims} PROCEDURE Execute(Hd1:HANDLE); VAR X1,Y1,X2,Y2 :REAL; RX1,RY1,RX2,RY2 :REAL;{Rect Dims} BEGIN GetBBox(Hd1,X1,Y1,X2,Y2); IF((X1<RX1) OR (X2>RX2) OR (Y1>RY1) OR (Y2<RY2)) THEN SetDSelect(Hd1); END; BEGIN Hd1 :=FSActLayer; IF FSActLayer = NIL THEN AlrtDialog('Selectionner un rectangle pour faire une sélection'); SetName(Hd1, 'MySelectionPolygon'); GetBBox(Hd1, X1, Y1, X2, Y2); RX1:=X1; RY1:=Y1; RX2:=X2; RY2:=Y2; Message('Coordonnées du rectangle',' RX1=', RX1,' RY1=', RY1,' RX2=', RX2,' RY2=', RY2); DSelectAll; SelectObj((NOTINDLVP & NOTINREFDLVP & (LOC='MySelectionPolygon'))); ForEachObject(Execute, ((NOTINDLVP & NOTINREFDLVP & (VSEL=TRUE)))); END; Run(selectInRect); Merci, Thomas TW_VS créer un rectangle_rectangleN_GetBBox_sur bureau_pour forum.vwx
  18. Merci Pat pour votre suggestion! Je vais tester ça demain et je vous tiens au courant, je n'avais pas pensé à cette possibilité de trier après la sélection... Thanks Pat for your suggestion! I'm going to test it tomorrow and I'll let you know, I hadn't thought of this possibility of sorting after the selection...
  19. Bonjour à tous, Je fais mes premiers tests de script et j'espère que mes explications seront assez claires. J'aimerai faire un script qui transforme un rectangle en une sélection, comme on pourrait le faire en utilisant l'outil Sélection, comme ci-dessous : Hi there, I'm doing my first script tests and I hope my explanations will be clear enough. I would like to make a script that transforms a rectangle into a selection, as one could do using the Selection tool, as below: Après des recherches sur le forum et dans l'aide je suis arrivé à ce script : After searching on the forum and in the help I arrived at this script: PROCEDURE selectInRect; VAR h1 :HANDLE; BEGIN h1 :=FSActLayer; IF FSActLayer = NIL THEN AlrtDialog('Sélectionner un rectangle pour faire une sélection'); SetName(h1, 'MySelectionPolygon'); DSelectAll; SelectObj((NOTINDLVP & NOTINREFDLVP & (LOC='MySelectionPolygon'))); END; Run(selectInRect); Ce qui me donne ce résultat : Which gives me this result: Cela fonctionne mais la fonction 'LOC' se base sur le centre des objets et ne réagit donc pas tout à fait comme l'outil Sélection. It works but the 'LOC' function is based on the center of the objects and therefore does not react quite like the Selection tool. Est ce que quelqu'un sait si on pourrait utiliser les coordonnées du rectangle pour faire une sélection à partir de ces coordonnées en utilisant l'outil sélection? Does anyone know if we could use the coordinates of the rectangle to make a selection from those coordinates using the selection tool? Ci-dessous les coordonnées du rectangle récupérées par GetBBox : Below are the coordinates of the rectangle retrieved by GetBBox: Je vous joins également le fichier .vwx pour tester. Merci et bonne journée! Thomas TW_VS créer un rectangle_rectangleN_GetBBox nettoyé pour forum.vwx
  20. Merci beaucoup Pat! Vos explications m'ont vraiment aidé. La principale erreur était d'utiliser le # à l'intérieur du WS_IF. J'ai laissé un espace dans une des valeurs par défaut de certaines listes déroulantes vu que je ne suis pas arrivé à créer une vrai ligne vide. Vous trouverez ci-joint un fichier exemple avec la version 5 qui fonctionne, le format de base de données est lier à un point 2d. Par contre il faut sélectionner le point 2d pour modifier les données, en éditant les données de l'étiquette seul la ligne 1 est disponible comme sur les captures ci-dessous. Thank you very much Pat! Your explanations really helped me. The main mistake was to use the # inside the WS_IF. I left a space in one of the default values of some drop-down lists since I couldn't create a real empty line. Attached is a sample file with version 5 working, the database format is bind to a 2d point. On the other hand, you must select point 2d to modify the data, by editing the label data only line 1 is available as in the screenshots below. Le fichier de test est ci-joint. Merci encore ! Etiquette de données sans ligne vide.vwx
  21. Salut à tous, J'essaye de faire une étiquette de données qui reprend les valeurs d'un format de base de données mais sans que des lignes vides apparaissent. J'ai essayé de m'inspiré de ce post : Hi all, I'm trying to make a data label that takes values from a database format but without blank lines appearing. I tried to take inspiration from this post: Dans la base de données ci-dessous ont voit que certaines valeur peuvent être vides et je voudrais trouver le raisonnement suivant : si la valeur est vide (ou est égal à un espace) alors n'écrit rien et retourne à la ligne : In the database below we see that some values can be empty and I would like to find the following reasoning: if the value is empty (or is equal to a space) then write nothing and return to the line: J'ai essayé les formules ci-dessous mais qui ne donnent pas le résultat souhaité : I tried the formulas below but they don't give the desired result: #Format de base de données#.#Ligne 1##WS_IF((#Format de base de données#.#Ligne 2#=' '); ''; CONCAT(CHAR(13); #Format de base de données#.#Ligne 2#))# Résultat : Pas de retour à la ligne ni de valeur pour #Format de base de données#.#Ligne 2# Result: No line break or value for #Format de base de données#.#Ligne 2# et: #Format de base de données#.#Ligne 1##WS_CONCAT(CHAR(13); (##Format de base de données#.#Ligne 2##))# Résultat : Pas de retour à la ligne mais ok pour la valeur Result: No line break but ok for the value #Format de base de données#.#Ligne 1##WS_CHAR(13)##Format de base de données#.#Ligne 2## Résultat : le retour à la ligne seul fonctionne Result: the line break alone works Si quelqu'un à une piste je suis preneur, j'ai lu les explications des fonctions sur https://developer.vectorworks.net/ mais je n'ai sûrement pas le bon raisonnement! If anyone has a clue, I'm interested, I've read explanations of the functions on https://developer.vectorworks.net/ but I probably don't have the right reasoning! sorry google translate, thanks Merci!
  22. Merci ! Au cas où si certains cherchent ça fonctionne chez moi sous windows mais avec des ; à la place des , #WS_COMPONENTNAME(1)##WS_IF(COMPONENTNAME(2)=''; ''; CONCAT(CHAR(13); COMPONENTNAME(2)))##WS_IF(COMPONENTNAME(3)=''; ''; CONCAT( CAR(13); NOM DU COMPOSANT(3)))#
×
×
  • Create New...