Hello,
I found it tedious to manually create bookmarks at the same location as the viewshed, so I tried using a Python script for the task.
Although I'm not very familiar with Python, I was able to confirm that the result is correct.(This work was assisted by ChatGPT. I would like to express my gratitude for the exceptional capabilities of ChatGPT. :))
from scripting import *
# Get a CityEngine instance
ce = CE()
# Function to add cameras and create bookmarks based on multiple Viewshed analyses
def addCamerasAndBookmarksForViewsheds():
# Get all objects in the scene
all_objects = ce.getObjectsFrom(ce.scene)
# Filter out the viewshed objects
viewsheds = [obj for obj in all_objects if ce.isViewshed(obj)]
if not viewsheds:
print("No viewshed analyses found in the scene.")
return
# Get the 3D view
viewport = ce.get3DViews()
# Iterate over each viewshed and create a camera and a bookmark
for i, viewshed in enumerate(viewsheds):
# Extract relevant viewshed information
observer_position = ce.getObserverPoint(viewshed)
angles = ce.getTiltAndHeadingAngles(viewshed)
#The heading angle of the bookmark needs to be multiplied by -1
#relative to the heading angle of the viewshed. I'm not sure if this
#is due to an issue with the coordinate system.
tilt, heading = angles[0], angles[1] * -1
# Set the camera details to match the viewshed direction and angle
viewport.setCameraPosition(observer_position[0], observer_position[1], observer_position[2])
viewport.setCameraRotation(tilt, heading, 0) # Corrected: tilt, heading, roll
# You can change the AOV
viewport.setCameraAngleOfView(39.6)
# Create a bookmark with the given name
bookmark_name = "Bookmark_{}".format(ce.getName(viewshed))
viewport.addBookmark(bookmark_name)
print("Bookmark '{}' created for viewshed '{}'.".format(bookmark_name, ce.getName(viewshed)))
# Main script execution
if __name__ == '__main__':
addCamerasAndBookmarksForViewsheds()
It's not best, but I hope it helps in some way
I have a hard time believing that this was ever an intended feature. What probably happened is someone finally saw this, went "That looks like a security problem", and patched it.
I wish there was a function to convert a viewshed into a bookmark.
Hi @desert,
Interesting script, thanks for sharing. To make it work in CityEngine I had to change a couple of lines at the start:
# Filter out the viewshed objects
viewsheds = ce.getObjectsFrom(ce.scene, ce.isViewshed)
if not viewsheds:
print("No viewshed analyses found in the scene.")
return
# Get the 3D view
viewport = ce.get3DViews()[0]
If I understand it correctly what you really would like to see is a way to create and edit bookmarks similar to how you can with Viewsheds. If this is the case I encourage you to express this as a new idea in the Ideas forum, this way it will get more traction 🙂
Cheers
Jonas