{"id":2985654,"date":"2026-11-10T07:00:59","date_gmt":"2026-11-10T15:00:59","guid":{"rendered":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=2985654"},"modified":"2026-11-10T07:37:41","modified_gmt":"2026-11-10T15:37:41","slug":"cityengine-python-scene-editing-tools","status":"publish","type":"blog","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/city-engine\/3d-gis\/cityengine-python-scene-editing-tools","title":{"rendered":"Custom productivity tools for ArcGIS CityEngine using the Python API"},"author":479608,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"open","ping_status":"closed","template":"","format":"standard","meta":{"_acf_changed":false,"_searchwp_excluded":""},"categories":[23771],"tags":[25781,760632,781171,756352],"industry":[],"product":[36781],"class_list":["post-2985654","blog","type-blog","status-publish","format-standard","hentry","category-3d-gis","tag-3d","tag-arcgis-cityengine","tag-python-api","tag-urban-design","product-city-engine"],"acf":{"authors":[{"ID":479608,"user_firstname":"Michael","user_lastname":"Bieri","nickname":"Michael Bieri","user_nicename":"mbieri","display_name":"Michael Bieri","user_email":"mbieri@esri.com","user_url":"","user_registered":"2026-10-22 13:20:07","user_description":"Michael Bieri is a Senior Software Engineer at the Esri R&amp;D Center in Zurich. He holds a PhD from ETH Zurich, where he also earned an MSc in Electrical Engineering.","user_avatar":"<img data-del=\"avatar\" src='https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/Man-in-black-puffer-jacket-1080x1080.png' class='avatar pp-user-avatar avatar-96 photo ' height='96' width='96'\/>"}],"short_description":"These tools facilitate scene editing in CityEngine. They are based on CityEngine's Python 3 API and come with a GUI with in-app documentation.","flexible_content":[{"acf_fc_layout":"image","image":{"ID":2986428,"id":2986428,"title":"scene_editing_tools_1920x1080","filename":"scene_editing_tools_1920x1080-1.png","filesize":998085,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/scene_editing_tools_1920x1080-1.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/city-engine\/3d-gis\/cityengine-python-scene-editing-tools\/scene_editing_tools_1920x1080-2","alt":"Python Scene Editing Tools for CityEngine","author":"479608","description":"","caption":"The Python Scene Editing Tools (right) running next to ArcGIS CityEngine (left).","name":"scene_editing_tools_1920x1080-2","status":"inherit","uploaded_to":2985654,"date":"2026-10-28 14:32:26","modified":"2026-10-28 14:32:31","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":1920,"height":1080,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/scene_editing_tools_1920x1080-1-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/scene_editing_tools_1920x1080-1.png","medium-width":464,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/scene_editing_tools_1920x1080-1.png","medium_large-width":768,"medium_large-height":432,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/scene_editing_tools_1920x1080-1.png","large-width":1920,"large-height":1080,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/scene_editing_tools_1920x1080-1-1536x864.png","1536x1536-width":1536,"1536x1536-height":864,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/scene_editing_tools_1920x1080-1.png","2048x2048-width":1920,"2048x2048-height":1080,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/scene_editing_tools_1920x1080-1-826x465.png","card_image-width":826,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/scene_editing_tools_1920x1080-1.png","wide_image-width":1920,"wide_image-height":1080}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p>When working with ArcGIS CityEngine scenes, most editing tasks are simple, but some can become tedious when repeated across many shapes or street segments. Typical examples include changing attributes across shapes with different rule files, reorganizing street lanes or cleaning up street networks.<\/p>\n<p>We created the <strong>Python Scene Editing Tools<\/strong> to simplify such time-consuming and repetitive edits. Using these tools, power users can edit scenes more efficiently.<\/p>\n<p>But there is more to the tools than solving these particular editing problems. They also show how CityEngine can be extended with custom editing capabilities built on its Python 3 API and modern web technologies.<\/p>\n<p>In this blog post, we cover the key features of the tools, how to get started and a few step-by-step examples.<\/p>\n<h2>Tools<\/h2>\n<p>The tools are grouped into five categories, each focused on common editing tasks.<\/p>\n<ul>\n<li><strong>Attribute Editing:<\/strong> Set attributes on all selected shapes regardless of their rule files, list all attributes, read attribute values<\/li>\n<li><strong>ESRI.lib Street Lane Rules:<\/strong> Configure crossings, vehicles and vegetation<\/li>\n<li><strong>Street Configurations:<\/strong> Detect segments with no configuration assigned, list configuration names<\/li>\n<li><strong>Street Lane Editing:<\/strong> Split, merge and resize lanes, create multiple lanes by numbers, get street and lane widths<\/li>\n<li><strong>Street Segment Editing:<\/strong> Merge segments, detect and merge consecutive segments, straighten consecutive segments, get and set segment lengths<\/li>\n<\/ul>\n<h2 id=\"getting-started\">Getting started<\/h2>\n<p>The tools are installed and launched entirely from within CityEngine. Before you start, make sure CityEngine 2026.1 is open.<\/p>\n<ol>\n<li><strong>Install:<\/strong> Download the example project through <code>Help \u2192 Download Tutorials and Examples \u2192 Example Python 04 Scene Editing Tools 2026.1<\/code>.<\/li>\n<li><strong>Run:<\/strong> In the CityEngine Navigator, open <code>\/Example_Python_04_Scene_Editing_Tools__2026_1\/scripts\/main.py<\/code> and run it with <code>F9<\/code> or <code>Python \u2192 Run Script<\/code>.<\/li>\n<li><strong>Use:<\/strong> The tools open in a new window with a web-based interface and in-app documentation for each tool. We recommend placing the window with the tools next to CityEngine. The tools apply to the scene that is currently open in CityEngine.<\/li>\n<\/ol>\n<h2>Examples<\/h2>\n<p>The following examples show how you can use the tools for various editing tasks.<\/p>\n<h3>Example 1: Attribute Editing<\/h3>\n<p>The CityEngine Inspector lets you edit rule attributes of several shapes at once only if they share the same rule file. The <strong>Set Attribute<\/strong> tools let you set a value on all selected shapes, regardless of their rule file.<\/p>\n<p>Open <code>\/Example_Python_04_Scene_Editing_Tools__2026_1\/scenes\/Set_Attribute.cej<\/code> in the Navigator. Our goal is to adjust the orientation and position of residential houses generated from different rule files.<\/p>\n<ol>\n<li>Select all shapes in the <code>Blocks<\/code> layer.<\/li>\n<li>In the tools window, expand <code>Attribute Editing<\/code> and open <code>Set Attribute (String)<\/code>.<\/li>\n<li>Enter <code>\/ce\/rule\/Direction<\/code> as <code>path<\/code> and <code>Parallel to Left<\/code> as <code>value<\/code>, then click <code>Run<\/code>.<\/li>\n<li>Open <code>Set Attribute (Float)<\/code>. Enter <code>\/ce\/rule\/Offset<\/code> as <code>path<\/code> and <code>10<\/code> as <code>value<\/code>, then click <code>Run<\/code>.<\/li>\n<li>All blocks now use the new direction and offset.<\/li>\n<\/ol>\n"},{"acf_fc_layout":"image","image":{"ID":2986429,"id":2986429,"title":"steps","filename":"steps-8.png","filesize":1650128,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/steps-8.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/city-engine\/3d-gis\/cityengine-python-scene-editing-tools\/steps-14","alt":"Set Attribute, step by step","author":"479608","description":"","caption":"Step-by-step instructions for editing attributes of shapes with different rule files.","name":"steps-14","status":"inherit","uploaded_to":2985654,"date":"2026-10-28 14:32:49","modified":"2026-10-28 14:32:57","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":2000,"height":2164,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/steps-8-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/steps-8.png","medium-width":241,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/steps-8.png","medium_large-width":768,"medium_large-height":831,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/steps-8.png","large-width":998,"large-height":1080,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/steps-8-1420x1536.png","1536x1536-width":1420,"1536x1536-height":1536,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/steps-8-1893x2048.png","2048x2048-width":1893,"2048x2048-height":2048,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/steps-8-430x465.png","card_image-width":430,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/steps-8-998x1080.png","wide_image-width":998,"wide_image-height":1080}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<h3>Example 2: ESRI.lib Street Lane Rules<\/h3>\n<p>In the CityEngine Inspector, crossings must be configured manually lane by lane. The <strong>Set Crossing<\/strong> tool lets you switch crossings on or off for all selected segments and nodes at once.<\/p>\n<p>Open <code>\/Example_Python_04_Scene_Editing_Tools__2026_1\/scenes\/Set_Crossing.cej<\/code> in the Navigator. Our goal is to remove the crossings in the bend of the side street and the double crossing at the bus stop.<\/p>\n<ol>\n<li>Select the diagonal segment of the side street and the node where it bends.<\/li>\n<li>In the tools window, expand <code>ESRI.lib Street Lane Rules<\/code> and open <code>Set Crossing<\/code>.<\/li>\n<li>Set <code>start<\/code> and <code>end<\/code> to <code>Disabled<\/code>, then click <code>Run<\/code>.<\/li>\n<li>The crossings at the bend are gone.<\/li>\n<li>Select the short segment of the side street and the main street segment left of the intersection.<\/li>\n<li>Open <code>Set Crossing<\/code> again. Set <code>start<\/code> to <code>Disabled<\/code> and <code>end<\/code> to <code>Enabled<\/code>, then click <code>Run<\/code>.<\/li>\n<li>The crossings in the bend and the double crossing at the bus stop are gone.<\/li>\n<\/ol>\n"},{"acf_fc_layout":"image","image":{"ID":2986430,"id":2986430,"title":"steps","filename":"steps-9-scaled.png","filesize":1266716,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/steps-9-scaled.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/city-engine\/3d-gis\/cityengine-python-scene-editing-tools\/steps-15","alt":"Set Crossing, step by step","author":"479608","description":"","caption":"Step-by-step instructions for editing crossings on all lanes of a street segment.","name":"steps-15","status":"inherit","uploaded_to":2985654,"date":"2026-10-28 14:33:05","modified":"2026-10-28 14:33:15","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":1780,"height":2560,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/steps-9-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/steps-9-scaled.png","medium-width":181,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/steps-9-scaled.png","medium_large-width":768,"medium_large-height":1105,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/steps-9-scaled.png","large-width":751,"large-height":1080,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/steps-9-1068x1536.png","1536x1536-width":1068,"1536x1536-height":1536,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/steps-9-1424x2048.png","2048x2048-width":1424,"2048x2048-height":2048,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/steps-9-323x465.png","card_image-width":323,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/steps-9-751x1080.png","wide_image-width":751,"wide_image-height":1080}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<h3>Example 3: Street Lane Editing<\/h3>\n<p>The <strong>Street Lane Editing<\/strong> tools let you create, resize, split and merge the lanes of a street configuration efficiently.<\/p>\n<p>Open <code>\/Example_Python_04_Scene_Editing_Tools__2026_1\/scenes\/Street_Lane_Editing.cej<\/code> in the Navigator. Our goal is to redesign a short street segment to accommodate a bus stop. This involves extensive rearrangement of the lanes.<\/p>\n<ol>\n<li>In the middle segment, select the four roadbed lanes south of the median.<\/li>\n<li>In the tools window, expand <code>Street Lane Editing<\/code> and open <code>Merge Lanes<\/code>.<\/li>\n<li>In <code>Merge Lanes<\/code>, click <code>Run<\/code>.<\/li>\n<li>The four lanes are now a single 8.6 m lane.<\/li>\n<li>Open <code>Split Lane by Widths<\/code>, enter <code>[3.3, -1, 2.5]<\/code> as <code>widths<\/code> (<code>-1<\/code> takes the remaining width), then click <code>Run<\/code>.<\/li>\n<li>The segment now has lanes of 3.3 m, 2.8 m and 2.5 m.<\/li>\n<li>Repeat steps 1\u20135 for the lanes north of the median, using <code>[2.5, -1, 3.3]<\/code> as <code>widths<\/code>.<\/li>\n<li>Assign and configure ESRI.lib lane rules on the new lanes. Here, we use <code>Bus_Lane.cga<\/code> with yellow asphalt and <code>Bulb_Lane.cga<\/code>.<\/li>\n<\/ol>\n"},{"acf_fc_layout":"image","image":{"ID":2986431,"id":2986431,"title":"steps","filename":"steps-10-scaled.png","filesize":1303898,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/steps-10-scaled.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/city-engine\/3d-gis\/cityengine-python-scene-editing-tools\/steps-16","alt":"Street Lane Editing, step by step","author":"479608","description":"","caption":"Step-by-step instructions for merging and splitting lanes to integrate a bus stop.","name":"steps-16","status":"inherit","uploaded_to":2985654,"date":"2026-10-28 14:33:24","modified":"2026-10-28 14:33:33","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":1780,"height":2560,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/steps-10-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/steps-10-scaled.png","medium-width":181,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/steps-10-scaled.png","medium_large-width":768,"medium_large-height":1105,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/steps-10-scaled.png","large-width":751,"large-height":1080,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/steps-10-1068x1536.png","1536x1536-width":1068,"1536x1536-height":1536,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/steps-10-1424x2048.png","2048x2048-width":1424,"2048x2048-height":2048,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/steps-10-323x465.png","card_image-width":323,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/steps-10-751x1080.png","wide_image-width":751,"wide_image-height":1080}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<h3>Example 4: Street Segment Editing<\/h3>\n<p>The <strong>Street Segment Editing<\/strong> tools let you select, straighten and merge chains of consecutive street segments efficiently.<\/p>\n<p>Open <code>\/Example_Python_04_Scene_Editing_Tools__2026_1\/scenes\/Street_Segment_Editing.cej<\/code> in the Navigator. Our goal is to clean up the messy segments in the middle of the street.<\/p>\n<ol>\n<li>Select the middle segment of the street.<\/li>\n<li>In the tools window, expand <code>Street Segment Editing<\/code> and open <code>Select Street Segment Chain<\/code>.<\/li>\n<li>In <code>Select Street Segment Chain<\/code>, click <code>Run<\/code>.<\/li>\n<li>The tool selects all five segments between the intersections.<\/li>\n<li>Open <code>Straighten Street Segments<\/code>, then click <code>Run<\/code>.<\/li>\n<li>All nodes now lie on a straight line.<\/li>\n<li>Open <code>Merge Street Segments<\/code>, then click <code>Run<\/code>.<\/li>\n<li>The street is now one segment from intersection to intersection.<\/li>\n<\/ol>\n"},{"acf_fc_layout":"image","image":{"ID":2986433,"id":2986433,"title":"steps","filename":"steps-11-scaled.png","filesize":1197716,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/steps-11-scaled.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/city-engine\/3d-gis\/cityengine-python-scene-editing-tools\/steps-17","alt":"Street Segment Editing, step by step","author":"479608","description":"","caption":"Step-by-step instructions for cleaning up street segments (selecting, straightening, merging).","name":"steps-17","status":"inherit","uploaded_to":2985654,"date":"2026-10-28 14:33:41","modified":"2026-10-28 14:33:50","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":1780,"height":2560,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/steps-11-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/steps-11-scaled.png","medium-width":181,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/steps-11-scaled.png","medium_large-width":768,"medium_large-height":1105,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/steps-11-scaled.png","large-width":751,"large-height":1080,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/steps-11-1068x1536.png","1536x1536-width":1068,"1536x1536-height":1536,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/steps-11-1424x2048.png","2048x2048-width":1424,"2048x2048-height":2048,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/steps-11-323x465.png","card_image-width":323,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/steps-11-751x1080.png","wide_image-width":751,"wide_image-height":1080}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<h2>Conclusion and next steps<\/h2>\n<p>In this blog post, we introduced the <strong>Python Scene Editing Tools<\/strong> for CityEngine and showed how they speed up tedious and repetitive scene editing tasks. To try them yourself, follow the installation steps in the <a href=\"#getting-started\">Getting started<\/a> section above. You can also use the CityEngine Python 3 API and web technologies to create your own custom tools.<\/p>\n"}],"related_articles":"","show_article_image":false,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/scene_editing_tools_826x465.png","wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/scene_editing_tools_1920x1080.png"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.9 (Yoast SEO v25.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Custom productivity tools for ArcGIS CityEngine using the Python API CityEngine scene editing with custom Python tools<\/title>\n<meta name=\"description\" content=\"More productive CityEngine scene editing with a Python-based productivity toolbox featuring a web interface and built-in documentation.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.esri.com\/arcgis-blog\/products\/city-engine\/3d-gis\/cityengine-python-scene-editing-tools\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Custom productivity tools for ArcGIS CityEngine using the Python API\" \/>\n<meta property=\"og:description\" content=\"More productive CityEngine scene editing with a Python-based productivity toolbox featuring a web interface and built-in documentation.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.esri.com\/arcgis-blog\/products\/city-engine\/3d-gis\/cityengine-python-scene-editing-tools\" \/>\n<meta property=\"og:site_name\" content=\"ArcGIS Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/esrigis\/\" \/>\n<meta property=\"article:modified_time\" content=\"2026-11-10T15:37:41+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@ESRI\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":[\"Article\",\"BlogPosting\"],\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/city-engine\/3d-gis\/cityengine-python-scene-editing-tools#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/city-engine\/3d-gis\/cityengine-python-scene-editing-tools\"},\"author\":{\"name\":\"Michael Bieri\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/a704979d5d64aadec08e33f354279944\"},\"headline\":\"Custom productivity tools for ArcGIS CityEngine using the Python API\",\"datePublished\":\"2026-11-10T15:00:59+00:00\",\"dateModified\":\"2026-11-10T15:37:41+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/city-engine\/3d-gis\/cityengine-python-scene-editing-tools\"},\"wordCount\":10,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\"},\"keywords\":[\"3D\",\"arcgis cityengine\",\"Python api\",\"Urban Design\"],\"articleSection\":[\"3D Visualization &amp; Analytics\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.esri.com\/arcgis-blog\/products\/city-engine\/3d-gis\/cityengine-python-scene-editing-tools#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/city-engine\/3d-gis\/cityengine-python-scene-editing-tools\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/city-engine\/3d-gis\/cityengine-python-scene-editing-tools\",\"name\":\"Custom productivity tools for ArcGIS CityEngine using the Python API CityEngine scene editing with custom Python tools\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#website\"},\"datePublished\":\"2026-11-10T15:00:59+00:00\",\"dateModified\":\"2026-11-10T15:37:41+00:00\",\"description\":\"More productive CityEngine scene editing with a Python-based productivity toolbox featuring a web interface and built-in documentation.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/city-engine\/3d-gis\/cityengine-python-scene-editing-tools#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.esri.com\/arcgis-blog\/products\/city-engine\/3d-gis\/cityengine-python-scene-editing-tools\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/city-engine\/3d-gis\/cityengine-python-scene-editing-tools#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.esri.com\/arcgis-blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Custom productivity tools for ArcGIS CityEngine using the Python API\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#website\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/\",\"name\":\"ArcGIS Blog\",\"description\":\"Get insider info from Esri product teams\",\"publisher\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.esri.com\/arcgis-blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\",\"name\":\"Esri\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png\",\"contentUrl\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png\",\"width\":400,\"height\":400,\"caption\":\"Esri\"},\"image\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/esrigis\/\",\"https:\/\/x.com\/ESRI\",\"https:\/\/www.linkedin.com\/company\/5311\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/a704979d5d64aadec08e33f354279944\",\"name\":\"Michael Bieri\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/Man-in-black-puffer-jacket-1080x1080.png\",\"contentUrl\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/Man-in-black-puffer-jacket-1080x1080.png\",\"caption\":\"Michael Bieri\"},\"description\":\"Michael Bieri is a Senior Software Engineer at the Esri R&amp;D Center in Zurich. He holds a PhD from ETH Zurich, where he also earned an MSc in Electrical Engineering.\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/author\/mbieri\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Custom productivity tools for ArcGIS CityEngine using the Python API CityEngine scene editing with custom Python tools","description":"More productive CityEngine scene editing with a Python-based productivity toolbox featuring a web interface and built-in documentation.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.esri.com\/arcgis-blog\/products\/city-engine\/3d-gis\/cityengine-python-scene-editing-tools","og_locale":"en_US","og_type":"article","og_title":"Custom productivity tools for ArcGIS CityEngine using the Python API","og_description":"More productive CityEngine scene editing with a Python-based productivity toolbox featuring a web interface and built-in documentation.","og_url":"https:\/\/www.esri.com\/arcgis-blog\/products\/city-engine\/3d-gis\/cityengine-python-scene-editing-tools","og_site_name":"ArcGIS Blog","article_publisher":"https:\/\/www.facebook.com\/esrigis\/","article_modified_time":"2026-11-10T15:37:41+00:00","twitter_card":"summary_large_image","twitter_site":"@ESRI","twitter_misc":{"Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":["Article","BlogPosting"],"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/city-engine\/3d-gis\/cityengine-python-scene-editing-tools#article","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/city-engine\/3d-gis\/cityengine-python-scene-editing-tools"},"author":{"name":"Michael Bieri","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/a704979d5d64aadec08e33f354279944"},"headline":"Custom productivity tools for ArcGIS CityEngine using the Python API","datePublished":"2026-11-10T15:00:59+00:00","dateModified":"2026-11-10T15:37:41+00:00","mainEntityOfPage":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/city-engine\/3d-gis\/cityengine-python-scene-editing-tools"},"wordCount":10,"commentCount":0,"publisher":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization"},"keywords":["3D","arcgis cityengine","Python api","Urban Design"],"articleSection":["3D Visualization &amp; Analytics"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.esri.com\/arcgis-blog\/products\/city-engine\/3d-gis\/cityengine-python-scene-editing-tools#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/city-engine\/3d-gis\/cityengine-python-scene-editing-tools","url":"https:\/\/www.esri.com\/arcgis-blog\/products\/city-engine\/3d-gis\/cityengine-python-scene-editing-tools","name":"Custom productivity tools for ArcGIS CityEngine using the Python API CityEngine scene editing with custom Python tools","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#website"},"datePublished":"2026-11-10T15:00:59+00:00","dateModified":"2026-11-10T15:37:41+00:00","description":"More productive CityEngine scene editing with a Python-based productivity toolbox featuring a web interface and built-in documentation.","breadcrumb":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/city-engine\/3d-gis\/cityengine-python-scene-editing-tools#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.esri.com\/arcgis-blog\/products\/city-engine\/3d-gis\/cityengine-python-scene-editing-tools"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/city-engine\/3d-gis\/cityengine-python-scene-editing-tools#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.esri.com\/arcgis-blog\/"},{"@type":"ListItem","position":2,"name":"Custom productivity tools for ArcGIS CityEngine using the Python API"}]},{"@type":"WebSite","@id":"https:\/\/www.esri.com\/arcgis-blog\/#website","url":"https:\/\/www.esri.com\/arcgis-blog\/","name":"ArcGIS Blog","description":"Get insider info from Esri product teams","publisher":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.esri.com\/arcgis-blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization","name":"Esri","url":"https:\/\/www.esri.com\/arcgis-blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png","contentUrl":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png","width":400,"height":400,"caption":"Esri"},"image":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/esrigis\/","https:\/\/x.com\/ESRI","https:\/\/www.linkedin.com\/company\/5311\/"]},{"@type":"Person","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/a704979d5d64aadec08e33f354279944","name":"Michael Bieri","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/image\/","url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/Man-in-black-puffer-jacket-1080x1080.png","contentUrl":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/Man-in-black-puffer-jacket-1080x1080.png","caption":"Michael Bieri"},"description":"Michael Bieri is a Senior Software Engineer at the Esri R&amp;D Center in Zurich. He holds a PhD from ETH Zurich, where he also earned an MSc in Electrical Engineering.","url":"https:\/\/www.esri.com\/arcgis-blog\/author\/mbieri"}]}},"text_date":"November 10, 2026","author_name":"Michael Bieri","author_page":"https:\/\/www.esri.com\/arcgis-blog\/author\/mbieri","custom_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/scene_editing_tools_1920x1080.png","primary_product":"ArcGIS CityEngine","tag_data":[{"term_id":25781,"name":"3D","slug":"3d","term_group":0,"term_taxonomy_id":25781,"taxonomy":"post_tag","description":"","parent":0,"count":362,"filter":"raw"},{"term_id":760632,"name":"arcgis cityengine","slug":"arcgis-cityengine","term_group":0,"term_taxonomy_id":760632,"taxonomy":"post_tag","description":"","parent":0,"count":9,"filter":"raw"},{"term_id":781171,"name":"Python api","slug":"python-api","term_group":0,"term_taxonomy_id":781171,"taxonomy":"post_tag","description":"","parent":0,"count":2,"filter":"raw"},{"term_id":756352,"name":"Urban Design","slug":"urban-design","term_group":0,"term_taxonomy_id":756352,"taxonomy":"post_tag","description":"","parent":0,"count":22,"filter":"raw"}],"category_data":[{"term_id":23771,"name":"3D Visualization &amp; Analytics","slug":"3d-gis","term_group":0,"term_taxonomy_id":23771,"taxonomy":"category","description":"","parent":0,"count":733,"filter":"raw"}],"product_data":[{"term_id":36781,"name":"ArcGIS CityEngine","slug":"city-engine","term_group":0,"term_taxonomy_id":36781,"taxonomy":"product","description":"","parent":36591,"count":89,"filter":"raw"}],"primary_product_link":"https:\/\/www.esri.com\/arcgis-blog\/?s=#&products=city-engine","_links":{"self":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/2985654","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/users\/479608"}],"replies":[{"embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/comments?post=2985654"}],"version-history":[{"count":16,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/2985654\/revisions"}],"predecessor-version":[{"id":2986985,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/2985654\/revisions\/2986985"}],"wp:attachment":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/media?parent=2985654"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/categories?post=2985654"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/tags?post=2985654"},{"taxonomy":"industry","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/industry?post=2985654"},{"taxonomy":"product","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/product?post=2985654"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}