Jump to content


  • Posts

  • Joined

  • Last visited


585 Spectacular

Personal Information

  • Homepage
  • Location
    United States

Recent Profile Visitors

6,384 profile views
  1. The best way to report a bug or request a feature that doesn't require discussion is to go straight here: https://benghiatlighting.com/software/support/report-a-bug/issue-pv/ A simpler method would be: - Add a group of locus points or draw a poly either the projector or focus points — whichever is fixed - Rotate your reference group - Rotate the projectors in the OIP. They will all rotate together around the fixed point. - With either throw or plan distance locked, drag each projector into place I will note that the mirror tool works as expected when duplicating, and by your examples, that seems like it would do exactly what you want (you can mirror across a 45° line to get a 90° rotation). Just make sure that in ProjectionViz's settings, you set the duplicating lock to "neither". Actually yes, all of those are maintained. The use case would be something like a ballroom or gallery where you know the placement of your image and the height of your projector as determined by the ceiling. Changing throw or tilt will maintain the heights and adjust the plan distance accordingly (as well as whichever of those two parameters you did not change). That isn't really possible. For example, let's say you change the throw in the OIP. If nothing is locked, you have no way of predicting how the projector cone will reshape. If you're just looking at the projector and image location locks, locking the throw will allow you drag the object and maintain the relationship between the image and projector. You can also always grab a control point and reshape that way — which will basically ignore any locks, as you are manually indicating how you want the cone to reshape. Control points work in both 2D and 3D. If viewing the section, control points default to a working plane parallel to the screen and at the center of the cone. Rotating will also work as expected with a single projector. The current behavior is designed to make the rotate menu commands behave in a more useful and logical way — at the moment that's at the sacrifice of transforming multiple projectors. If this doesn't help, you'll have to be more explicit about the types of transformations you are trying to accomplish.
  2. @Mark Aceto One more thing — if you're dealing with floor projections, make sure to set your image plane to horizontal. PV will show a horizontal or parallel plane if a vertical plane does not exist, but that makes manipulating the projector more complicated.
  3. @Mark Aceto You are correct that ProjectionViz isn't properly rotating around an arbitrary point (in your case, the center of the group or multi-selection). This is something I've solved with BeamViz, so it's possible to improve, and I filed a bug. The UI you suggest with the stair tool is from a dialog, and unfortunately VW doesn't have a mechanism to do anything like that in the OIP. Unlike with stairs, where you have a very specific set of conditions (getting from point A to point B in code-approved increments), PV is designed to allow for experimentation and adjusting, and I don't think going to a dialog makes sense every time you want to adjust a parameter. Note that the Calc Focus Height button provides for additional "locks" that allow you to calculate tilt based on where you want your image to land. Between this and the OIP locks, you should be able to place the projector based on any specification. Please say more. I can't improve this without a bug report or feature request. That's not entirely true. This depends what you're trying to adjust. If you're wanting to maintain the tilt angle, then set the throw to lock. This will maintain the vector of the throw, and if you're wanting to maintain tilt, really the only thing you can adjust is image size, lens, and throw. Of course things like pan, image rotation, and lens shift always maintain the tilt.
  4. It's possible, but there's not really built-in mechanisms for managing the inner plug-in. You basically have two options: 1. Insert the inner PIO in the profile group of the outer PIO. On regeneration, your outer PIO makes a copy of the inner PIO from the profile group into its main geometry. The user would have to edit the profile group in order to modify the inner PIO. 2. Create a parent/child link between objects. You would use a hidden data field to record a link between objects (saving the UUID for each object works well). You have to account for all the various possibilities of the relationship: what if one deletes, what if one moves, what if one changes layer, etc.
  5. You can set the type of PIO in the plug-in manager to be rectangle or path based. In the case of the rectangular PIO, you have width and length as default parameters. The oddity with rectangles, is the origin is the center-left. For path-based plug-ins, the path is stored in a “path group” attached to the plug-in. You have vs commands for accessing the path group. You would either copy the polyline into your object, or parse the path’s vertices and use for your code.
  6. Savvy Linesets is fully compatible with 2022. Please submit a support request here: https://benghiatlighting.com/software/support/contact/ You'll need to provide more information on the errors you are seeing, as well as your platform (including chipset for Macs) and OS.
  7. I believe RunImageComp is designed for unit testing — it all was you to check if the desired screen geometry matches the expected geometry saved in an image. Take a look in the file interfaces. There should be a bitmap interface for exporting and importing images.
  8. Yes — a handle is like a temporary ID for an object (it's actually the location of where the object is stored in Vectorworks' memory). Most vs functions take the handle as the parameter. ForEachObject lets you send selected objects to your action function. You might want something like this: Function ChangeClass( h: HANDLE ):BOOLEAN; BEGIN SetClass( h, 'None' ); END; ForEachObjectInList( ChangeClass, 2 {selected objects}, 0 {shallow}, FSActLayer );
  9. SetClass() will set an object's class. https://developer.vectorworks.net/index.php/VS:SetClass ForEachObject() will iterate through objects https://developer.vectorworks.net/index.php/VS:ForEachObject also https://developer.vectorworks.net/index.php/VS:ForEachObjectInLayer https://developer.vectorworks.net/index.php/VS:ForEachObjectInList
  10. I did some quick experimenting to see if doing something like placing an underscore in front of the display name would lock the choice the way it does with a parameter, and don't see any difference. I thin this would be a worthy enhancement. I recently had a user confused why a pull-down item disabled other widgets. In theory, the pull-down item itself should have been disabled.
  11. At one point I found the menu command or tool's parameters unreliable for storing data, so I've looked to other methods. It might not even still be supported. Options are: Set/GetSavedSetting() if you want the date to persist between sessions. The Rpstr_ commands for sorting temporary data (it persists per session, so you can pass between commands or runs of a command) Create a hidden record for storing data to the file. You would want custom get/set commands that create the record if it doesn't exist.
  12. I thank that’s a VectorScript bug. VS should handle undo automatically. That said, the Compose command will do what you want without a script.
  13. To answer your specific question, you want to pass the address of the pointer, rather than defining a double pointer VectorWorks::IMeshDataPtr thisMesh; bool isGetMesh = gSDK->GetMesh( meshH, & thisMesh );
  14. I would take a look at the example for UpdateSupport. That may be the best way to define the triggers for reading and writing the json file. For example, you could write to the file whenever VW becomes inactive and read whenever VW becomes active. IStdFile is your best bet for reading and writing text files. The SDK now includes json.hpp for parsing and creating JSON strings. I prefer ForEachObjectN, which lets you use a standard lambda as the action function, rather than having to deal with casting env. The action function should screen for Lighting Devices: VWParametricObj::IsParametricObj() Using with the Lighting Device IID is much faster than using the universal name Create a VWParametricObj instance from the lighting device handle to retrieve all your data. You probably want a vector of lightingDevices to pass to the action function.
  15. I'm actually not sure if FEO will only look at drawing objects. That may be the case, in which case Raymond's method might be the best. @elepp The code example won't work, regardless. You have: crit = ("N = TAB_WE_H*") This is a tuple, containing a string. Not to be confused with: crit = "(N = 'TAB_WE_H*')" The main difference here is that the parentheses are inside the double quotes. The quotes are what define the variable as a string in python. () {} and [] will define tuples, dicts, and arrays. Also, criteria are finicky about key words versus values. Non-numeric values always need to be enclosed in single quotes (which is actually much easier in python than vs). Having each keyword / value test in parentheses is also good form, though I think less important for a single selector.
  • Create New...