Repository: ansys/DevRelDocs
Pull request #139: Update documentation
Author: login: echambla
Created: 2025-04-02T12:15:37Z | Merged: 2025-04-02T16:02:43Z

- Add information about PySpeos in How to set up my client
- Modify flowchart to add PySpeos in the diagram


Diff:
diff --git a/2025R1_SP1/speos_rpc-25-r1-sp1/README.md b/2025R1_SP1/speos_rpc-25-r1-sp1/README.md
deleted file mode 100644
index bf7326daaf..0000000000
--- a/2025R1_SP1/speos_rpc-25-r1-sp1/README.md
+++ /dev/null
@@ -1,261 +0,0 @@
-# Context
-The SpeosRPC Server is based on gRPC and provides APIs to interact with Speos Solver.  
-
-Please be aware that the server is intended to work with a single user.  
-The server is under development, so all Speos features are not available yet.
-
-## Why SpeosRPC Server?  
-This allows the user to use the Speos capabilities without starting any CAD.  
-This offers the possibility to manage Speos capabilities with more liberty:
-- Data preparation
-- Running jobs
-- Result post processing
-
-## gRPC usage advantages
-There are several advantages of using gRPC
-- Language independency between client and server.  
-This means that the user has a large choice of languages to write the API calls.  
-The user does not have to write the same language as the server.
-- OS independency between client and server.  
-The client does not have to run on the same OS as the server.  
-The SpeosRPC server is provided for Linux and Windows.
-- The client and server can run on different machines.
-
-## Schema
-The schema shows different ways to use Speos capabilities:
-- via CADs / Labs / Viewers GUIs
-- via SpeosRPC Server APIs
-
-![Alt text](flowchart.svg?raw=true "Title")
-
-
-### Speos Solver
-The Speos Solver represents the intelligence that is used to handle the light simulation. 
-
-### SpeosRPC Server
-The SpeosRPC Server allows to translate the provided gRPC API calls into features understood by the Speos Solver.
-
-# Workflow
-Step 1 : Download the SpeosRPC Server  
-Step 2 : Set up the client  
-Step 3 : Create your scripts  
-Step 4 : Launch the server  
-Step 5 : Run your scripts (that will call the server)
-## Where to find the SpeosRPC Server?  
-When you install Speos using the unified installer, you can add the SpeosRPC Server to be downloaded.  
-By default, it will be stored in `C:/Program Files/ANSYS Inc/<vxxx>/Optical Products/SPEOS_RPC`
-
-## How to set up my client?
-Setting up a client is a mandatory step in the process.  
-The goal of setting up the client is to translate the proto files into the language in which you have chosen to write your scripts. 
-The proto files contain all the definitions of the Speos features to be translated. 
-By default, the proto files will be stored in `C:/Program Files/ANSYS Inc/<vxxx>/Optical Products/SPEOS_RPC/APIGrammar`.  
-
-A documentation can be found [here](https://grpc.io/docs/) to help you generate in your chosen language the client interface of the services implemented by the server.  
-Once the code is autogenerated, you will have access to all Speos features available in your chosen language.
-
-Thanks to the autogenerated code you will be able to write scripts.
-
-## How to launch SpeosRPC Server?
-An executable called SpeosRPC_Server is present in the current folder.  
-The option --help is available to know more about possible arguments, and also to know how to properly shut down the server.
-```bash
-./SpeosRPC_Server.exe --help
-```
-
-Example of how to properly shutdown a server started on port 50053:
-```bash
-./SpeosRPC_Server.exe --stop 50053
-```
-
-
-# Information about ansys-api-speos API
-## Proto files
-The APIs are defined in proto files.  
-Those proto files can be found in the folder `APIGrammar/ansys/api/speos/<featureName>/v<X>/<featureName>.proto`.  
-An example of `<featureName>` can be `sop` (surface optical property).  
-`v<X>` represents the version of the feature, example `v1` for the first version.
-
-## Documentation
-A documentation is automatically generated and stored in the folder `APIGrammar/doc`.  
-This documentation is based on the comments that are present in the .proto files.
-
-## Key principles
-Some key principles will be described here.  
-It is important to read them before writing the first calls to the server.
-
-### XXXsManager vs XXXActions
-Many proto files that represent basic Speos features are composed of two different services:
-XXXsManager and XXXActions.
-
-#### XXXsManager
-The manager allows the client to handle the features it is in charge of.  
-Example: a SpectrumsManager allows to create/read/update/delete a spectrum, and list all spectrums present.   
-The managers allow to create a kind of library of objects.  
-Here is an imaginary example of a manager that would handle the feature Object (which contains only a name and a description).
-```txt
-// Manager for Objects
-service ObjectsManager {
-	// Create an Object
-	rpc Create(Create_Request) returns (Create_Response) {}
-	// Read an Object
-	rpc Read(Read_Request) returns (Read_Response) {}
-	// Update an Object
-	rpc Update(Update_Request) returns (Update_Response) {}
-	// Delete an Object
-	rpc Delete(Delete_Request) returns (Delete_Response) {}
-	// List all Objects in manager
-	rpc List(List_Request) returns (List_Response) {}
-}
-
-message Object {
-	string name = 1; // Object name
-	string description = 2; // Object description
-}
-```
-Every XXXsManager service is composed of five methods.  
-- Create  
-Takes the Object message in the request and gives back its corresponding guid once created in the manager.
-```txt
-// Request to create an Object in ObjectsManager
-message Create_Request {
-	Object object = 1;
-}
-message Create_Response {
-	string guid = 1; // Guid of the Object created in ObjectsManager
-}
-```
-- Read  
-From the guid received in request, gives back its corresponding Object message in the manager.
-```txt
-// Request to read an Object in ObjectsManager
-message Read_Request {
-	string guid = 1; // Guid of the Object to be read
-}
-message Read_Response {
-	Object object = 1; // Object corresponding to the guid given in Read_Request
-}
-```
-- Update  
-Replace the object corresponding to the guid received by the Object message present in the request
-```txt
-// Request to update an Object in ObjectsManager
-message Update_Request {
-	string guid = 1; // Guid of the Object to be updated
-	Object object = 2; // Object that will be used for the update
-}
-message Update_Response {}
-```
-- Delete  
-Delete the object corresponding to the guid received in the request
-```txt
-// Request to delete an Object in ObjectsManager
-message Delete_Request {
-	string guid = 1; // Guid of the Object to be deleted
-}
-message Delete_Response {}
-```
-- List  
-List all objects present in the manager. Return their guids.  
-Tip: Can be combined with Read method to retrieve all Object messages and not only guids.
-```txt
-message List_Request {}
-message List_Response {
-	repeated string guids = 1; // Guids of the Objects in ObjectsManager
-}
-```
-
-#### XXXActions
-Sometimes some other methods are needed to interact with a feature. But those methods do not fit in the CRUD framework.  
-In this case we enter the service XXXActions.  
-This gathers all actions that can be done on a specific feature.  
-Specific feature means a feature that has been created in its manager, so that its guid is known.  
-The first field of an action request is always the guid of the feature concerned.
-
-Example of an action on a scene: load a .speos file to fill it.
-```txt
-service SceneActions {
-    rpc LoadFile(LoadFile_Request) returns (LoadFile_Response) {} 
-}
-
-message LoadFile_Request {
-	string guid = 1; // Guid of a ScenesManager element to update
-    string file_uri = 2; // File uri (path or guid from FileTransferService) 
-}
-
-message LoadFile_Response {}
-```
-
-### Template vs Instance
-When applicable, the features are separated in two different notions: template and instance.  
-The template represents the feature with its inherent caracteristics.  
-The instance represents the completion of a template by adding properties such as spatial position, link to geometry, etc.
-
-#### Template
-The template objects are handled by a manager that was described in the section above `XXXsManager`.  
-The interesting thing about the template notion is that the same template can be used several times with different properties.  
-Currently, all the Speos features are not yet available. The user can find the available ones in the template objects protofiles.
-
-#### Instance
-The template objects are instantiated in the Scene object, with properties needed to place them at the wanted position, or attached to the wanted geometry.  
-The Scene object will gather all features that you need to run a job (compute a simulation).  
-For example, it is possible to:
-- Create a SourceTemplate::Luminaire with its inherent characteristics -> get its guid in SourceTemplatesManager
-- Create a Scene::SourceInstance using the luminaire's guid as source_guid and position it via the LuminaireProperties using an axis_system
-- Create another Scene::SourceInstance using the luminaire's guid as source_guid and position it somewhere else via the LuminaireProperties using an axis_system
-
-The Scene object will be described in the following section.
-
-### Scene
-The Scene is the main Speos feature.  
-It is a way to gather all features that are needed to have an optical scene.  
-Just below can be found the SpeosRPC data preparation big picture:
-
-![Alt text](classDiagram.svg?raw=true "Title")
-
-### Job
-The job feature appears in the graph just above.  
-The job is responsible for computing a simulation.  
-It is a way to link to a specific SimulationInstance of a specific Scene, and choose some properties (job type, properties specific to the SimulationTemplate type like stop conditions).  
-Then the `JobActions` can be called on a specific job to:
-- Start
-- Stop
-- GetProgressStatus
-- GetResults
-- ...
-
-### Geo path and xxx_path
-Some objects in the Scene need to refer to a geometry, in this case a GeoPath is needed.  
-There is a GeoPath explanation in the auto generated documentation.  
-A GeoPath is a string that allows the user to target a geometry, by using geometry names separated by "/".  
-That can be the whole geometry, a whole sub part, a whole body, a face.  
-"" -> the whole root part of the scene  
-"body0" -> the whole body named body0 contained in the root part  
-"body0/face0" -> the face named face0 contained in the body named body0 contained in the root part  
-"part1" -> the whole part named part1 contained in the root part  
-"part1/body1" -> the whole body named body1 contained in the part named part1 contained in the root part
- 
-Some objects in the Scene need to refer to some Instance, in this case a xxx_path is needed.  
-Those objects are refered thanks to their name.  
-Example for the SimulationInstance that needs to refer to some SensorInstances via the field sensor_paths.  
-An explanation is also given in the auto generated documentation of the concerned fields.  
-"" -> all sensors instantiated in the scene  
-"sensor1" -> the sensor instance named sensor1 contained in the scene
-
-### File transfer
-If the client is in the situation where the server is not on the same machine, it is then important not to give the local path when a file is expected in a message.  
-Example:
-```txt
-message LoadFile_Request {
-	string guid = 1; // Guid of a ScenesManager element to update
-    string file_uri = 2; // File uri (path or guid from FileTransferService) 
-}
-```
-The field `file_uri` is expecting 
-- either a local path (this works only if the server is on the same machine as the client)
-- or a guid retrieved after uploading the file via the FileTransferService
-
-The FileTransferService (present in `ansys/api/speos/file/v1/file_transfer.proto`) allows to upload/download files to/from the server.  
-A python helper is also present (in `ansys/api/speos/file/v1/file_transfer.py`), to ease the usage of the FileTransferService in case of python client.  
-When a file is uploaded to the server, the uri representing the file is returned in the message FileSystemItemInformation.  
-This uri can then be used instead of a local path in the fields xxx_file_uri.
\ No newline at end of file
diff --git a/2025R1_SP1/speos_rpc-25-r1-sp1/flowchart.png b/2025R1_SP1/speos_rpc-25-r1-sp1/flowchart.png
index 9290087d1b..59b4733ece 100644
Binary files a/2025R1_SP1/speos_rpc-25-r1-sp1/flowchart.png and b/2025R1_SP1/speos_rpc-25-r1-sp1/flowchart.png differ
diff --git a/2025R1_SP1/speos_rpc-25-r1-sp1/flowchart.svg b/2025R1_SP1/speos_rpc-25-r1-sp1/flowchart.svg
index 588ee91bc4..2f3f5ce44d 100644
--- a/2025R1_SP1/speos_rpc-25-r1-sp1/flowchart.svg
+++ b/2025R1_SP1/speos_rpc-25-r1-sp1/flowchart.svg
@@ -1,3 +1,3 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<?xml-stylesheet href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.6.0/css/all.min.css" type="text/css"?>
-<svg aria-roledescription="flowchart-v2" role="graphics-document document" viewBox="0 0 710.5 174" style="max-width: 100%;" class="flowchart" xmlns="http://www.w3.org/2000/svg" width="100%" id="graph-div" height="100%" xmlns:xlink="http://www.w3.org/1999/xlink"><style>#graph-div{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#ccc;}#graph-div .error-icon{fill:#a44141;}#graph-div .error-text{fill:#ddd;stroke:#ddd;}#graph-div .edge-thickness-normal{stroke-width:1px;}#graph-div .edge-thickness-thick{stroke-width:3.5px;}#graph-div .edge-pattern-solid{stroke-dasharray:0;}#graph-div .edge-thickness-invisible{stroke-width:0;fill:none;}#graph-div .edge-pattern-dashed{stroke-dasharray:3;}#graph-div .edge-pattern-dotted{stroke-dasharray:2;}#graph-div .marker{fill:lightgrey;stroke:lightgrey;}#graph-div .marker.cross{stroke:lightgrey;}#graph-div svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#graph-div p{margin:0;}#graph-div .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#ccc;}#graph-div .cluster-label text{fill:#F9FFFE;}#graph-div .cluster-label span{color:#F9FFFE;}#graph-div .cluster-label span p{background-color:transparent;}#graph-div .label text,#graph-div span{fill:#ccc;color:#ccc;}#graph-div .node rect,#graph-div .node circle,#graph-div .node ellipse,#graph-div .node polygon,#graph-div .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#graph-div .rough-node .label text,#graph-div .node .label text,#graph-div .image-shape .label,#graph-div .icon-shape .label{text-anchor:middle;}#graph-div .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#graph-div .rough-node .label,#graph-div .node .label,#graph-div .image-shape .label,#graph-div .icon-shape .label{text-align:center;}#graph-div .node.clickable{cursor:pointer;}#graph-div .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#graph-div .arrowheadPath{fill:lightgrey;}#graph-div .edgePath .path{stroke:lightgrey;stroke-width:2.0px;}#graph-div .flowchart-link{stroke:lightgrey;fill:none;}#graph-div .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#graph-div .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#graph-div .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#graph-div .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#graph-div .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#graph-div .cluster text{fill:#F9FFFE;}#graph-div .cluster span{color:#F9FFFE;}#graph-div div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(20, 1.5873015873%, 12.3529411765%);border:1px solid rgba(255, 255, 255, 0.25);border-radius:2px;pointer-events:none;z-index:100;}#graph-div .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#graph-div rect.text{fill:none;stroke-width:0;}#graph-div .icon-shape,#graph-div .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#graph-div .icon-shape p,#graph-div .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#graph-div .icon-shape rect,#graph-div .image-shape rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#graph-div :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}</style><g><marker orient="auto" markerHeight="8" markerWidth="8" markerUnits="userSpaceOnUse" refY="5" refX="5" viewBox="0 0 10 10" class="marker flowchart-v2" id="graph-div_flowchart-v2-pointEnd"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowMarkerPath" d="M 0 0 L 10 5 L 0 10 z"></path></marker><marker orient="auto" markerHeight="8" markerWidth="8" markerUnits="userSpaceOnUse" refY="5" refX="4.5" viewBox="0 0 10 10" class="marker flowchart-v2" id="graph-div_flowchart-v2-pointStart"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowMarkerPath" d="M 0 5 L 10 10 L 10 0 z"></path></marker><marker orient="auto" markerHeight="11" markerWidth="11" markerUnits="userSpaceOnUse" refY="5" refX="11" viewBox="0 0 10 10" class="marker flowchart-v2" id="graph-div_flowchart-v2-circleEnd"><circle style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowMarkerPath" r="5" cy="5" cx="5"></circle></marker><marker orient="auto" markerHeight="11" markerWidth="11" markerUnits="userSpaceOnUse" refY="5" refX="-1" viewBox="0 0 10 10" class="marker flowchart-v2" id="graph-div_flowchart-v2-circleStart"><circle style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowMarkerPath" r="5" cy="5" cx="5"></circle></marker><marker orient="auto" markerHeight="11" markerWidth="11" markerUnits="userSpaceOnUse" refY="5.2" refX="12" viewBox="0 0 11 11" class="marker cross flowchart-v2" id="graph-div_flowchart-v2-crossEnd"><path style="stroke-width: 2; stroke-dasharray: 1, 0;" class="arrowMarkerPath" d="M 1,1 l 9,9 M 10,1 l -9,9"></path></marker><marker orient="auto" markerHeight="11" markerWidth="11" markerUnits="userSpaceOnUse" refY="5.2" refX="-1" viewBox="0 0 11 11" class="marker cross flowchart-v2" id="graph-div_flowchart-v2-crossStart"><path style="stroke-width: 2; stroke-dasharray: 1, 0;" class="arrowMarkerPath" d="M 1,1 l 9,9 M 10,1 l -9,9"></path></marker><g class="root"><g class="clusters"></g><g class="edgePaths"><path marker-end="url(#graph-div_flowchart-v2-pointEnd)" style="" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" id="L_StandardUsers_SpeosSolver_0" d="M473.078,35L479.78,35C486.482,35,499.885,35,515.172,38.891C530.458,42.783,547.627,50.566,556.211,54.457L564.795,58.349"></path><path marker-end="url(#graph-div_flowchart-v2-pointEnd)" style="" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" id="L_SpeosRPCServer_SpeosSolver_1" d="M452.813,139L462.892,139C472.971,139,493.13,139,511.794,135.109C530.458,131.217,547.627,123.434,556.211,119.543L564.795,115.651"></path><path marker-end="url(#graph-div_flowchart-v2-pointEnd)" style="" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" id="L_User_SpeosRPCServer_2" d="M99.797,106.397L112.655,111.831C125.513,117.265,151.229,128.132,179.656,133.566C208.083,139,239.221,139,254.79,139L270.359,139"></path><path marker-end="url(#graph-div_flowchart-v2-pointEnd)" style="" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" id="L_User_StandardUsers_3" d="M99.797,67.603L112.655,62.169C125.513,56.735,151.229,45.868,176.279,40.434C201.328,35,225.711,35,237.902,35L250.094,35"></path></g><g class="edgeLabels"><g transform="translate(513.2890625, 35)" class="edgeLabel"><g transform="translate(-15.2109375, -12)" class="label"><foreignObject height="24" width="30.421875"><div style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" class="labelBkg" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel"><p>uses</p></span></div></foreignObject></g></g><g transform="translate(513.2890625, 139)" class="edgeLabel"><g transform="translate(-15.2109375, -12)" class="label"><foreignObject height="24" width="30.421875"><div style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" class="labelBkg" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel"><p>uses</p></span></div></foreignObject></g></g><g transform="translate(176.9453125, 139)" class="edgeLabel"><g transform="translate(-52.1484375, -12)" class="label"><foreignObject height="24" width="104.296875"><div style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" class="labelBkg" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel"><p>calls APIs from</p></span></div></foreignObject></g></g><g transform="translate(176.9453125, 35)" class="edgeLabel"><g transform="translate(-25.0390625, -12)" class="label"><foreignObject height="24" width="50.078125"><div style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" class="labelBkg" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel"><p>uses UI</p></span></div></foreignObject></g></g></g><g class="nodes"><g transform="translate(628, 87)" id="flowchart-SpeosSolver-72" class="node default"><rect height="54" width="149" y="-27" x="-74.5" style="" class="basic label-container"></rect><g transform="translate(-44.5, -12)" style="" class="label"><rect></rect><foreignObject height="24" width="89"><div style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" xmlns="http://www.w3.org/1999/xhtml"><span class="nodeLabel"><p>Speos Solver</p></span></div></foreignObject></g></g><g transform="translate(363.5859375, 139)" id="flowchart-SpeosRPCServer-73" class="node default"><rect height="54" width="178.453125" y="-27" x="-89.2265625" style="" class="basic label-container"></rect><g transform="translate(-59.2265625, -12)" style="" class="label"><rect></rect><foreignObject height="24" width="118.453125"><div style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" xmlns="http://www.w3.org/1999/xhtml"><span class="nodeLabel"><p>SpeosRPC Server</p></span></div></foreignObject></g></g><g transform="translate(363.5859375, 35)" id="flowchart-StandardUsers-74" class="node default"><rect height="54" width="218.984375" y="-27" x="-109.4921875" style="" class="basic label-container"></rect><g transform="translate(-79.4921875, -12)" style="" class="label"><rect></rect><foreignObject height="24" width="158.984375"><div style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" xmlns="http://www.w3.org/1999/xhtml"><span class="nodeLabel"><p>CADs / Labs / Viewers</p></span></div></foreignObject></g></g><g transform="translate(53.8984375, 87)" id="flowchart-User-79" class="node default"><rect height="54" width="91.796875" y="-27" x="-45.8984375" style="" class="basic label-container"></rect><g transform="translate(-15.8984375, -12)" style="" class="label"><rect></rect><foreignObject height="24" width="31.796875"><div style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" xmlns="http://www.w3.org/1999/xhtml"><span class="nodeLabel"><p>User</p></span></div></foreignObject></g></g></g></g></g></svg>
\ No newline at end of file
+<?xml-stylesheet href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/all.min.css" type="text/css"?>
+<svg aria-roledescription="flowchart-v2" role="graphics-document document" style="overflow: hidden; max-width: 100%;" class="flowchart" xmlns="http://www.w3.org/2000/svg" width="100%" id="graph-129" height="100%" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events"><g id="viewport-20250402083702384" class="svg-pan-zoom_viewport" transform="matrix(1.183130612708878,0,0,1.183130612708878,158.70322900652968,48.74997783222448)" style="transform: matrix(1.18313, 0, 0, 1.18313, 158.703, 48.75);"><style>#graph-129{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#ccc;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#graph-129 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#graph-129 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#graph-129 .error-icon{fill:#a44141;}#graph-129 .error-text{fill:#ddd;stroke:#ddd;}#graph-129 .edge-thickness-normal{stroke-width:1px;}#graph-129 .edge-thickness-thick{stroke-width:3.5px;}#graph-129 .edge-pattern-solid{stroke-dasharray:0;}#graph-129 .edge-thickness-invisible{stroke-width:0;fill:none;}#graph-129 .edge-pattern-dashed{stroke-dasharray:3;}#graph-129 .edge-pattern-dotted{stroke-dasharray:2;}#graph-129 .marker{fill:lightgrey;stroke:lightgrey;}#graph-129 .marker.cross{stroke:lightgrey;}#graph-129 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#graph-129 p{margin:0;}#graph-129 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#ccc;}#graph-129 .cluster-label text{fill:#F9FFFE;}#graph-129 .cluster-label span{color:#F9FFFE;}#graph-129 .cluster-label span p{background-color:transparent;}#graph-129 .label text,#graph-129 span{fill:#ccc;color:#ccc;}#graph-129 .node rect,#graph-129 .node circle,#graph-129 .node ellipse,#graph-129 .node polygon,#graph-129 .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#graph-129 .rough-node .label text,#graph-129 .node .label text,#graph-129 .image-shape .label,#graph-129 .icon-shape .label{text-anchor:middle;}#graph-129 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#graph-129 .rough-node .label,#graph-129 .node .label,#graph-129 .image-shape .label,#graph-129 .icon-shape .label{text-align:center;}#graph-129 .node.clickable{cursor:pointer;}#graph-129 .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#graph-129 .arrowheadPath{fill:lightgrey;}#graph-129 .edgePath .path{stroke:lightgrey;stroke-width:2.0px;}#graph-129 .flowchart-link{stroke:lightgrey;fill:none;}#graph-129 .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#graph-129 .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#graph-129 .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#graph-129 .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#graph-129 .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#graph-129 .cluster text{fill:#F9FFFE;}#graph-129 .cluster span{color:#F9FFFE;}#graph-129 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(20, 1.5873015873%, 12.3529411765%);border:1px solid rgba(255, 255, 255, 0.25);border-radius:2px;pointer-events:none;z-index:100;}#graph-129 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#graph-129 rect.text{fill:none;stroke-width:0;}#graph-129 .icon-shape,#graph-129 .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#graph-129 .icon-shape p,#graph-129 .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#graph-129 .icon-shape rect,#graph-129 .image-shape rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#graph-129 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}</style><g><marker orient="auto" markerHeight="8" markerWidth="8" markerUnits="userSpaceOnUse" refY="5" refX="5" viewBox="0 0 10 10" class="marker flowchart-v2" id="graph-129_flowchart-v2-pointEnd"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowMarkerPath" d="M 0 0 L 10 5 L 0 10 z"></path></marker><marker orient="auto" markerHeight="8" markerWidth="8" markerUnits="userSpaceOnUse" refY="5" refX="4.5" viewBox="0 0 10 10" class="marker flowchart-v2" id="graph-129_flowchart-v2-pointStart"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowMarkerPath" d="M 0 5 L 10 10 L 10 0 z"></path></marker><marker orient="auto" markerHeight="11" markerWidth="11" markerUnits="userSpaceOnUse" refY="5" refX="11" viewBox="0 0 10 10" class="marker flowchart-v2" id="graph-129_flowchart-v2-circleEnd"><circle style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowMarkerPath" r="5" cy="5" cx="5"></circle></marker><marker orient="auto" markerHeight="11" markerWidth="11" markerUnits="userSpaceOnUse" refY="5" refX="-1" viewBox="0 0 10 10" class="marker flowchart-v2" id="graph-129_flowchart-v2-circleStart"><circle style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowMarkerPath" r="5" cy="5" cx="5"></circle></marker><marker orient="auto" markerHeight="11" markerWidth="11" markerUnits="userSpaceOnUse" refY="5.2" refX="12" viewBox="0 0 11 11" class="marker cross flowchart-v2" id="graph-129_flowchart-v2-crossEnd"><path style="stroke-width: 2; stroke-dasharray: 1, 0;" class="arrowMarkerPath" d="M 1,1 l 9,9 M 10,1 l -9,9"></path></marker><marker orient="auto" markerHeight="11" markerWidth="11" markerUnits="userSpaceOnUse" refY="5.2" refX="-1" viewBox="0 0 11 11" class="marker cross flowchart-v2" id="graph-129_flowchart-v2-crossStart"><path style="stroke-width: 2; stroke-dasharray: 1, 0;" class="arrowMarkerPath" d="M 1,1 l 9,9 M 10,1 l -9,9"></path></marker><g class="root"><g class="clusters"></g><g class="edgePaths"><path marker-end="url(#graph-129_flowchart-v2-pointEnd)" style="" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" id="L_StandardUsers_SpeosSolver_0" d="M724.75,35L731.452,35C738.154,35,751.557,35,768.036,40.028C784.514,45.057,804.067,55.114,813.843,60.142L823.62,65.17"></path><path marker-end="url(#graph-129_flowchart-v2-pointEnd)" style="" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" id="L_SpeosRPCServer_SpeosSolver_0" d="M704.484,146L714.564,146C724.643,146,744.802,146,763.466,142.109C782.13,138.217,799.298,130.434,807.883,126.543L816.467,122.651"></path><path marker-end="url(#graph-129_flowchart-v2-pointEnd)" style="" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" id="L_User_SpeosRPCServer_0" d="M99.797,109L106.499,109C113.201,109,126.604,109,149.776,109C172.948,109,205.888,109,249.487,109C293.086,109,347.344,109,394.554,112.478C441.764,115.955,481.927,122.91,502.009,126.388L522.09,129.866"></path><path marker-end="url(#graph-129_flowchart-v2-pointEnd)" style="" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" id="L_PySpeos_SpeosRPCServer_0" d="M297.438,183L314.798,183C332.159,183,366.88,183,404.322,179.522C441.764,176.045,481.927,169.09,502.009,165.612L522.09,162.134"></path><path marker-end="url(#graph-129_flowchart-v2-pointEnd)" style="" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" id="L_User_StandardUsers_0" d="M85.317,82L94.432,74.167C103.547,66.333,121.777,50.667,147.363,42.833C172.948,35,205.888,35,249.487,35C293.086,35,347.344,35,391.167,35C434.99,35,468.378,35,485.072,35L501.766,35"></path><path marker-end="url(#graph-129_flowchart-v2-pointEnd)" style="" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" id="L_User_PySpeos_0" d="M85.317,136L94.432,143.833C103.547,151.667,121.777,167.333,136.928,175.167C152.078,183,164.148,183,170.184,183L176.219,183"></path></g><g class="edgeLabels"><g transform="translate(764.9609375, 35)" class="edgeLabel"><g transform="translate(-15.2109375, -12)" class="label"><foreignObject height="24" width="30.421875"><div style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" class="labelBkg" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel"><p>uses</p></span></div></foreignObject></g></g><g transform="translate(764.9609375, 146)" class="edgeLabel"><g transform="translate(-15.2109375, -12)" class="label"><foreignObject height="24" width="30.421875"><div style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" class="labelBkg" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel"><p>uses</p></span></div></foreignObject></g></g><g transform="translate(238.828125, 109)" class="edgeLabel"><g transform="translate(-52.1484375, -12)" class="label"><foreignObject height="24" width="104.296875"><div style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" class="labelBkg" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel"><p>calls APIs from</p></span></div></foreignObject></g></g><g transform="translate(401.6015625, 183)" class="edgeLabel"><g transform="translate(-79.1640625, -12)" class="label"><foreignObject height="24" width="158.328125"><div style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" class="labelBkg" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel"><p>calls python APIs from</p></span></div></foreignObject></g></g><g transform="translate(238.828125, 35)" class="edgeLabel"><g transform="translate(-25.0390625, -12)" class="label"><foreignObject height="24" width="50.078125"><div style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" class="labelBkg" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel"><p>uses UI</p></span></div></foreignObject></g></g><g transform="translate(140.0078125, 183)" class="edgeLabel"><g transform="translate(-15.2109375, -12)" class="label"><foreignObject height="24" width="30.421875"><div style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" class="labelBkg" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel"><p>uses</p></span></div></foreignObject></g></g></g><g class="nodes"><g transform="translate(879.671875, 94)" id="flowchart-SpeosSolver-0" class="node default"><rect height="54" width="149" y="-27" x="-74.5" style="" class="basic label-container"></rect><g transform="translate(-44.5, -12)" style="" class="label"><rect></rect><foreignObject height="24" width="89"><div style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" xmlns="http://www.w3.org/1999/xhtml"><span class="nodeLabel"><p>Speos Solver</p></span></div></foreignObject></g></g><g transform="translate(615.2578125, 146)" id="flowchart-SpeosRPCServer-1" class="node default"><rect height="54" width="178.453125" y="-27" x="-89.2265625" style="" class="basic label-container"></rect><g transform="translate(-59.2265625, -12)" style="" class="label"><rect></rect><foreignObject height="24" width="118.453125"><div style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" xmlns="http://www.w3.org/1999/xhtml"><span class="nodeLabel"><p>SpeosRPC Server</p></span></div></foreignObject></g></g><g transform="translate(615.2578125, 35)" id="flowchart-StandardUsers-2" class="node default"><rect height="54" width="218.984375" y="-27" x="-109.4921875" style="" class="basic label-container"></rect><g transform="translate(-79.4921875, -12)" style="" class="label"><rect></rect><foreignObject height="24" width="158.984375"><div style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" xmlns="http://www.w3.org/1999/xhtml"><span class="nodeLabel"><p>CADs / Labs / Viewers</p></span></div></foreignObject></g></g><g transform="translate(53.8984375, 109)" id="flowchart-User-7" class="node default"><rect height="54" width="91.796875" y="-27" x="-45.8984375" style="" class="basic label-container"></rect><g transform="translate(-15.8984375, -12)" style="" class="label"><rect></rect><foreignObject height="24" width="31.796875"><div style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" xmlns="http://www.w3.org/1999/xhtml"><span class="nodeLabel"><p>User</p></span></div></foreignObject></g></g><g transform="translate(238.828125, 183)" id="flowchart-PySpeos-9" class="node default"><rect height="54" width="117.21875" y="-27" x="-58.609375" style="" class="basic label-container"></rect><g transform="translate(-28.609375, -12)" style="" class="label"><rect></rect><foreignObject height="24" width="57.21875"><div style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;" xmlns="http://www.w3.org/1999/xhtml"><span class="nodeLabel"><p>PySpeos</p></span></div></foreignObject></g></g></g></g></g></g></svg>
\ No newline at end of file
diff --git a/2025R1_SP1/speos_rpc-25-r1-sp1/index.md b/2025R1_SP1/speos_rpc-25-r1-sp1/index.md
index a10ceacaab..ee57bd7c97 100644
--- a/2025R1_SP1/speos_rpc-25-r1-sp1/index.md
+++ b/2025R1_SP1/speos_rpc-25-r1-sp1/index.md
@@ -68,6 +68,11 @@ Once the code is autogenerated, you will have access to all Speos features avail
 
 Thanks to the autogenerated code you will be able to write scripts.
 
+Note:  
+For your information, a Python client exists and can be used.  
+The Python client, named PySpeos, allows you to use a client without needing to auto-generate code from the proto files.  
+PySpeos documentation (package ansys-speos-core) can be found [here](https://speos.docs.pyansys.com/).
+
 ### How to launch SpeosRPC Server?
 
 An executable called SpeosRPC_Server is present in the current folder.  


Reviews:
user: login: AnsMelanie
body: @echambla 
You modified the README.md, but it's not published on the Dev portal. As you can see in toc.yml, only other files are uploaded. I believe these changes should be made in index.md instead. Thanks!
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-02T12:44:23Z
user: login: nicolasANSS
state: CHANGES_REQUESTED
author_association: COLLABORATOR
submitted_at: 2025-04-02T13:02:50Z
user: login: nicolasANSS
state: APPROVED
author_association: COLLABORATOR
submitted_at: 2025-04-02T14:56:20Z
user: login: AnsMelanie
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-02T14:59:23Z
user: login: AnsMelanie
state: APPROVED
author_association: COLLABORATOR
submitted_at: 2025-04-02T16:02:37Z

Review comments:
diff_hunk: @@ -56,6 +56,11 @@ Once the code is autogenerated, you will have access to all Speos features avail
 
 Thanks to the autogenerated code you will be able to write scripts.
 
+Note:  
+For information, a python client exists and can be used.  
path: 2025R1_SP1/speos_rpc-25-r1-sp1/README.md
user: login: nicolasANSS
body: @echambla "For your information"
created_at: 2025-04-02T13:00:00Z
author_association: COLLABORATOR
diff_hunk: @@ -56,6 +56,11 @@ Once the code is autogenerated, you will have access to all Speos features avail
 
 Thanks to the autogenerated code you will be able to write scripts.
 
+Note:  
+For information, a python client exists and can be used.  
+This is a way for user to use a client without having to auto generate code from the proto files.  
path: 2025R1_SP1/speos_rpc-25-r1-sp1/README.md
user: login: nicolasANSS
body: @echambla "The Python client, named PySpeos, allows you to use a client without needing to auto-generate code from the proto files".
created_at: 2025-04-02T13:01:45Z
author_association: COLLABORATOR
diff_hunk: @@ -56,6 +56,11 @@ Once the code is autogenerated, you will have access to all Speos features avail
 
 Thanks to the autogenerated code you will be able to write scripts.
 
+Note:  
+For information, a python client exists and can be used.  
+This is a way for user to use a client without having to auto generate code from the proto files.  
+Documentation about this python client named PySpeos (package ansys-speos-core) can be find [here](https://speos.docs.pyansys.com/).
path: 2025R1_SP1/speos_rpc-25-r1-sp1/README.md
user: login: nicolasANSS
body: @echambla "PySpeos documentation (package ansys-speos-core) can be found [here]"
created_at: 2025-04-02T13:02:26Z
author_association: COLLABORATOR
diff_hunk: @@ -68,6 +68,11 @@ Once the code is autogenerated, you will have access to all Speos features avail
 
 Thanks to the autogenerated code you will be able to write scripts.
 
+Note:  
+For your information, a python client exists and can be used.  
path: 2025R1_SP1/speos_rpc-25-r1-sp1/index.md
user: login: AnsMelanie
body: .., a Python client exists
created_at: 2025-04-02T14:59:08Z
author_association: COLLABORATOR

PR comments:
user: login: echambla
created_at: 2025-04-02T12:47:47Z
body: > @echambla You modified the README.md, but it's not published on the Dev portal. As you can see in toc.yml, only other files are uploaded. I believe these changes should be made in index.md instead. Thanks!

Sorry then I do that!
author_association: CONTRIBUTOR
user: login: echambla
created_at: 2025-04-02T13:32:52Z
body: @AnsMelanie Then if it is ok for you I deleted the README.md. Do you confirm it is not needed at all?
author_association: CONTRIBUTOR