Jump to content


  • Posts

  • Joined

  • Last visited

Everything posted by DomC

  1. Hi Alan The first content-node returns two objects (two groups). The first group inputted again in a content-node and then returns the 4 profiles. The second group is used directly (keeping grouped) for the brochures. Further explanations: 1. The control-geometry-node exactly collects just one (first back) object in the control-geometry container. So if there are more than one objects they have to be grouped. 2. I created two more groups inside the first group (which can be entered with "content" node). First (back) for Profiles. Second (front) for brochures. The Input in Marionette goes from back to front (order of the objects). 3. Because I have groups I use "content-nodes" to go deeper inside the groups. Also groups helping to order (an object in the first group will never goes in ordner of a object from the second group). So groups help here to structure the input geometry order. 4. The sort lists also helps to get control of the object order. They are not essentially but without order list, the sequence of node wires would be relevant for the object order and this results in even more fragility of the input system. 5. At least by editing control-geometry we have to take care about not changing the object and group orders. Group will not change order because we just have to enter them. But if there several objects inside a group, the ordner of this objects easily will change, if we redraw/delete them. To solve that order Issue every single object should be grouped (Which I did not made in this example) Or an other strategy to handle the objects (Names are not possible, because of duplication or copy/paste in new documents they got lost). Alternatives were symbols (Which is the best option I think) or record formats to handle objects. Also the network contains some "delete"-nodes. Which I think maybe have no effect. Sometimes controll geometry was obstinately visible. I just tried to get them away :-) Sorry for my english. Hope it can be unterstood. Dom
  2. Support 2D/3D objects and points. Returns min max positions and values. Can be used for putting geometry together or grabbing objects and move them to a specific point. Also this could be done with native nodes, by getting 3D infos and calculating offset to specific points and moving them by the offset. I am not sure, what is the right strategy to do those things in future (wrapper vs. node).
  3. Hi This file is running properly on my mac (Wrap). I Suppose there could be a Problem with the File Name, File Path, Vectorworks Installation Path or the User Settings (User/Library/Application Support/Vectorworks /2016 /PlugIns) try out deleting the marionette folder here. Hope that works ... Mac OSX 10.10.5 i7
  4. Hi This Marionette PIO draws a brochure holder with various settings. Parameters over Info Palette. Profiles and brochure (Brochure Textures, brochure Format) over control geometry. Enter and edit control geometry in top plan view (correct bounding box). Special: Use of a custom Node, which automatically alines an object by it's bounding box to a refered place.
  5. Hi What to do, if Input Values from "non-Dim-Nodes" deliver wrong dimension values? It could be horrible just to multiply lists/tuples, point values etc. by factor. Attached Node can help. It calculates every value of list up to double nested lists by the unit factor of the document. This node just works but the code inside could look ugly to a programmer. But as yet I did not found anything better than that. How it works: The Node has a Popup. With that popup you can set the input units. And get output values in the document units. Dom
  6. Wow ... nice Rendering. This cry out for a random-book-arrow-marionette-pio :-) Dom
  7. New version v0.9: Also available a mutation with a "value-feeder" to create a complete furniture wall. The Info-Palette is a bit cryptic but allows. Thousands of Variants, with just about 20 input Fields.
  8. Hi Attached, an Example. Dom 1. Script in the cell: =RUNSCRIPT('kantenbild-script') 2. Script which will be executed: sheet_h=vs.ActSSheet() if sheet_h != None and vs.GetName(sheet_h)!='XGST-VSSM Liste mit KB': numRows, numColumns=vs.GetWSRowColumnCount(sheet_h) startrow=9 rows=numRows-startrow for x in range(rows): kabi=[] k=[] k1=vs.GetWSCellString(sheet_h,x+startrow, 14) k2=vs.GetWSCellString(sheet_h,x+startrow, 16) k3=vs.GetWSCellString(sheet_h,x+startrow, 18) k4=vs.GetWSCellString(sheet_h,x+startrow, 20) k=([k1],[k2],[k3],[k4]) for i in range(4): if k[i] !=['']: kabi.append('1') if k[i] ==['']: kabi.append('0') vs.SetWSCellVertAlignment(sheet_h, startrow, 24, numRows, 24, 3) vs.SetWSColumnWidth(sheet_h, 24, 24, 37) vs.SetWSImgSizeType(sheet_h, x+startrow, 24, x+startrow,24, 1) vs.SetWSImgSize(sheet_h, x+startrow, 24, x+startrow, 24, 48, 48) vs.SetWSRowHeight(sheet_h, startrow, numRows, 37, True, True) vs.SetWSCellFormula(sheet_h, x+startrow, 24, x+startrow, 24, '=IMAGE(N=\'n.vssm.k'+str(kabi[0])+str(kabi[1])+str(kabi[2])+str(kabi[3])+'\')')
  9. A Text-Script based Marionette Object. Technical Info: About 30 Options in the Infopalette. And many if then combinations, which results in drawing/not drawing a part of the cabinet. I did this first with a graphical script network. But there was no possibility to NOT execute part of a graphical script because of an option. It is just possible to execute/draw everything and then delete objects. Which results in a disadvantage of speed. So I desided to write code instead. Anyway, this is also something, marionette can be used for. Dom Edit: 24.12.2015 new Version (Dim Values, Shells)
  10. Hm .. python should accept mix of single AND double quotes to use quote inside a string. So your example should work. Also maybe checked out by escape quote by \ ? vs.Message('I\'ve made it this far') It seems to work inside the Vectorscript Editor. Maybe if you have this in an external text file, Text encoding, text reading routines etc. do their part to destort the string. TextEdit saves (as standard) with UTF-8. Vectorworks imports with ...? Just an unqualified idea
  11. Hi If you are working on Windows, maybe your anti-virus-software (AVAST maybe), will block your Vectorworks from launching. Try pause your anti virus for 5 Minutes and launch Vectorworks. If that works, add The Vectorworks Programm Folder to the "Whitelist" and activate virus protection again. Also check, if your graphic driver is fairly up to date: http://kbase.vectorworks.net/questions/1139/Video+Card+%7B47%7D+Graphics+Card+Guidelines+for+Vectorworks+-+Oct+20%2C+2015 On mac, it could be a font-issue. It's a shot in the dark but accidentally i saw exactly the same"overnight" problem with avast anti virus last week. If it was an avast-issue, a short feedback would be nice. Dom
  12. Tim Thanks a lot. Your post brought me to search in the right direction There seems to be many solutions to convert with python. But after several encoding, decoding tries. I searched again "http://developer.vectorworks.net/" for encoding topics. Lo and behold: There was a vectorscript function to do that job :-)!!! vs.StringAnsiToMac(string) Nice. Thanks again Tim Dom
  13. Hi there I wonder how to handle special character issues in a smooth way. I use the following commands in my script: HSFPath=vs.GetFPathName() bool, path=vs.ConvertHSF2PosixPath(HSFPath) My File name is äöüéè.vwx. And Vectorscript procudes a file path like "C:\Users\dom\Desktop\‰ˆ¸ÈË.vwx" After that I have to replace those "characters" manually by script: umlaut={'ä':'‰','ö':'ˆ','ü':'¸','é':'È','è':'Ë','à':'à'} #Python dict with the replace character path=path.replace(umlaut.get('ä'),'ä') #umlaut.get(dictkey) path=path.replace(umlaut.get('ö'),'ö') path=path.replace(umlaut.get('ü'),'ü') path=path.replace(umlaut.get('é'),'é') path=path.replace(umlaut.get('è'),'è') path=path.replace(umlaut.get('à'),'à') OK, the path.replace part, maybe could maybe be better programmed. But is there any standard procedure for file-path-character issues like this? Handling pathes is daily business. Well, it works on mac platform. The complete script: HSFPath=vs.GetFPathName() bool, path=vs.ConvertHSF2PosixPath(HSFPath) umlaut={'ä':'‰','ö':'ˆ','ü':'¸','é':'È','è':'Ë','à':'à'} path=path.replace(umlaut.get('ä'),'ä') path=path.replace(umlaut.get('ö'),'ö') path=path.replace(umlaut.get('ü'),'ü') path=path.replace(umlaut.get('é'),'é') path=path.replace(umlaut.get('è'),'è') path=path.replace(umlaut.get('à'),'à') path=path[:-3]+'txt' inPath=path skipHeader= False asString=True delimiter="\t" codex='iso8859_2' #'latin_1', 'iso8859_2', 'mac_latin2','utf_8' #https://docs.python.org/3/library/codecs.html lines=[] rows=[] import csv import os if asString==False: quote=csv.QUOTE_NONNUMERIC else: quote=csv.QUOTE_NONE if os.path.isfile(inPath) == False: vs.AlrtDialog('Das Info-File der ERP Software wurde nicht gefunden. Dieses Script liesst eine Textdatei mit gleichem Namen wie die Vectorworks Datei ein. Bitte Erkundigen Sie sich bei Ihrem ERP/PPS Softwarelieferanten über diese Möglichkeit') rowNum=10 lineNum=10 if os.path.isfile(inPath) ==False: for x in range(rowNum): rows.append('error Import File') for x in range(lineNum): lines.append('error') FilePath=('import File missed') if os.path.isfile(inPath) ==True: with open(inPath, encoding=codex) as f: reader= csv.reader(f,dialect='excel',delimiter=delimiter,quoting=quote) if skipHeader==True: next(reader) for line in reader: lines.append(line) lineNum=len(lines) rowNum=len(line) for row in range(rowNum): rown=[] for line in range(lineNum): rown.append(lines[line][row]) rows.append(rown) if asString==False: rows = tuple(tuple(x) for x in rows) rows = list(rows) lines = tuple(tuple(x) for x in lines) lines = list(lines) erpdict=dict(zip(lines[0], lines[1])) plankopf="INSYMBOL & INOBJECT & INVIEWPORT & ('VAA Title Block'.'__Other4'='ERP_Plankopf')" #plankopf="INGROUP & INVIEWPORT & (R IN ['VAA Title Block'])" def PlankopfFelder(h): vs.SetRField(h, 'VAA Title Block', '__ProjName', erpdict.get('PRO_STAMM_PROJEKTBEZ')) vs.SetRField(h, 'VAA Title Block', '__ClientName', erpdict.get('ADR_NAME_FIRMA')) vs.SetRField(h, 'VAA Title Block', '__ProjAddress', erpdict.get('ADR_STRASSE')+', '+erpdict.get('ADR_PLZ')+' '+erpdict.get('ADR_ORT')) vs.SetRField(h, 'VAA Title Block', '__ProjNo', erpdict.get('PRO_STAMM_PROJEKTNR')) vs.ResetObject(h) return() vs.ForEachObject(PlankopfFelder, plankopf)
  14. How About directly input the symbol in your extrude? You could edit your symbol properties (blue symbol) and insert the symbol directly as a poly (as long as you have not more than one object in the symbol) Any-Input-Node, can be handy for testing (even better than connecting many of input nodes to simulate an input :-). At a more final version, we should use dim-inputs for input values (Document Units).
  15. Hi Alan Nice, a Cabinet Door with a Handle profile ... :-) Path: Maybe it is better to use Linear Extrude for this. So you just input start and endpoint and not have to input a path object. Profile: I would prefer to input this profile as a geometry. You can handle a Geometry by wrapping it to an marionette object and attach profile in the control group box: 1. Group Polygon 2. Connect controll geometry node and contend node to get poly I think grouping is maybe necessary, to not have your poly as a control path. Or if you want to use different profiles. Also you could get your profile, out of a symbol definition (took a look at my exhibition wall example?). For testing your code, Name the group with the poly, name it (info-palette) and input by "name-node" If you your are creating our profile with nodes with nodes, maybe use the "any input node" and input [(0.0, 0.0),(20.0, 0.0), (20.0, 20.0),(30.0, 60.0),(-50.0, 60.0),(-50.0, 50.0),(-40.0, 50.0),(-40.0, 55.0), (10.0, 55.0),(0.0, 0.0)] I also still searching the best practice to input geometries. I hope there is something thereby you can use.
  16. Hi there A Marionette Path Object for rectangular exhibition walls. Use second reshape methode to edit path. The objects uses symbols for profiles and walls. So you are able to control wall thickness, classes and material over the symbol definition. Make sure the symbols are content of your document. Offcut or start points of the duplication are controlled inside the marionette script. There are some custom nodes used like: duplicate array between points, insert symbol and change wall length
  17. Hi David Hm, I just hav experience by using python moduls for text handling. Because you can get help for this via google for every error message. Also with python you can do so much more (sort, arrange, split, sorting out characters etc). An Example. Which Reads a text fila as one single string value. To get File Dialog use vs.GetFile, after that you should convert the path (Which is MacHD:User:Dom:etc:ect) to a Posix Path (MacHD/User/Dom/etc/etc) Try this: import vs fileName = vs.GetFile() bool, fileName=vs.ConvertHSF2PosixPath(fileName) a=open(fileName).read() vs.Message(a)
  18. Hi Alan You can check if your value is from 600 to 1200 and returns a "True". That can be complicated if you have many if then statements or if maybe a specific combination of true or false should gives other results. If you produce many True and False "Answers" and if just one of them would be "False" the whole result is False (if >600 is true and >1200 is false and smartDoor is true etc. etc.) the answer still will be False (just one door as example) and for your example you can do it this way:
  19. Hi Alan https://techboard.vectorworks.net/ubbthreads.php?ubb=showflat&Number=217181#Post217181 Download "HandyNodesAndWrappers v02" there is a insert symbol node. Just connect Point Input for locus and string input for symbol name. Dom
  20. A Similar node, which reads ini files and returns sections, keys and values Uses the python standard configparser module.
  21. This is awesome Jared, now things are really heating up! @Ilay I did not even got to work ktinker to work. This was just a test and would be not very helpful because ktinker do not much more, than the internal dialog features can do. Even if I am not a fan of using too much third party stuff. Thanks Dom
  22. Hi Patrick Very nice example. This could be a very suitable and classic example to use for teaching classes. Thanks for sharing Dom
  23. Output values are visible, when you click with the second method of the marionette tool on a wire (the "debug" methode). If there is no wire, connect a "Dummy End", which can be found under de "Debug" symbol popup.
  24. Hi This Marionette object contains a custom node, which reads a text file. One special application could be to automatically write something like an address or a descreption etc. into the plan. Can be very interesting for customers which has to integrate Vectorworks in their software enviroment and rather more pushing data into the document than "self-drawn" content. Maybe first read the "instruction.pdf" to see for which special case this example is thought.
  25. Hi Jonathan Very cool and applicable example. Thanks for sharing. Dom
  • Create New...