New Feature: Perspective Piping

Introducing Perspective Piping, a major new Coordinate Container feature available in the next nightly. Perspective Piping allows you to quickly draw pipes within Perspective.

A new Coordinate Container Prop named “pipes” has been added to the coordinate container. Each pipe is an object containing a name, appearance, various appearance specific props, and an origin.

An origin is the (x, y) start point for the pipe. Each origin may have any number of connections, and those connections may have any number of connections, and so forth. Together they form a tree that represent the entire pipe.


When Pipes are present, they appear in the Project browser just like a component. They can be quickly selected, renamed, cut, copied, duplicated, and deleted through the project browser.


Selecting a pipe in the Project browser will switch to Pipe Draw Mode. Two new design modes were added: Pipe Draw Mode, and Pipe Move Mode. They can be quickly toggled through the toolbar. From Left to right: Component Mode(the default - what we’re all familiar with), Pipe Draw Mode, and Pipe Move Mode.


While in Pipe Draw Mode, clicking anywhere within the Coordinate Container will create a new Pipe with an origin at the location you clicked. This will also select the newly created origin. Selected pipe origins and connections will display arrows which can be dragged to create new connections.


Clicking in the middle of a pipe will split the pipe, creating a connection in between the two connections.


Dragging a point on top of its immediate parent or child will combine the points. You can also delete points by pressing delete key, or right click delete.


Dragging a point to another pipe will combine the pipes. The newly combined pipe will inherit all the appearance properties of the connection being dragged.


Components have anchor points at their top, right, bottom, andleft locations, and Symbol Components have custom “natural” anchor points. When dragging a pipe point, the point snaps to these anchors. However if the component is moved afterwards, the point will not “stick” to the point. These points are only used while dragging pipe connections.


While dragging a point, there are different move modes that are activated by holding down a hot key. Orthogonal- the default attempts to keep connections orthogonal to each other as they are moved. rotation (alt) - rotates a point about its parent, if its the origin it will rotate around its first child. Free move (shift) moves a single point freely without snapping.


While in Pipe Draw Mode a hint displays at the bottom of the window to remind you of what these hotkeys are.


While in Pipe Move Mode, pipes can be selected by clicking on them. ctrl click to select multiple pipes. These pipes may be moved all at once by dragging the selection and scaled by dragging the scale anchor in the lower right corner of the selection.


A new Pipe Property Editor has also been added, allowing for rapid editing of the appearance and appearance specific props. It displays when at least one pipe is selected. When multiple pipes are selected, a subset of properties are displayed that are relevant to the appearance of all selected pipes. IE if a mix of Mimic and Simple pipes are selected, only the Simple related props are displayed(because they are relevant to both Mimic and Simple).
The value displayed is based on the first selected pipe, but changing the properties will affect all selected pipes. This works similarly to editing props of multiple components at the same time.


these look AWESOME!

1 Like

Looks really cool :slight_smile:
One suggestion though is to have the ability to have a global pipe orientation precedence, and automatically create gaps (configurable) in pipes where they cross over each other. E.g. set horizontal precedence and then all vertical pipes that cross over a horizontal pipe would have a gap to let the horizontal pipe be shown uninterrupted and without having pipes visibly crossing over each other which can cause confusion, especially since ASM standard pipes should be flat colour (see screenshot below).

Otherwise, can we create a segment gap in a continuous pipe?

e.g. in Inkscape:

This would allow us to use one pipe instead of having to create multiple pipes either side of the gap, or adding bogus extra wide pipes the same colour as the page background in order to fake the gap, and then having to fight with z-layers to get it at the right level


The new 8.1.10 version rocks.
First add tooltip
Next add element selection for XY chart and Pie chart
And now draw Piping
I’m really surprised this time.

I only have one suggestion for pipe. Adding corner radius as property for each corner is really nice. We have pipe with different corner radius for single pipe bends in the P&ID.


Something that I am seeing is that the piping doesn’t scale well when you have the coordinate container in percent mode. This makes it tough when I am designing for both 5:4 and 16:9 screens.


@nader.chinichian The developer hasn’t gotten around to posting here in the forum yet, but if you look in the Session Events you’ll also see that we added Perspective Key Event handling. :fire: We’d been working on these features over the last several sprints, and they all just happened to wrap up in the same week.


Oh my god, dream comes true, I wonder what you will show us in this ICC :wink:
May a new spatial coordinate container for pan and zooming or full-fledged drawing tools :grin:

1 Like

Is there a style with just a solid line rather than a pipe (for electrical diagrams)?

1 Like

Solid colour lines are how pipes should be presented :wink:

Also, just set fill and stroke the same, or stroke to none

Yes, set the appearance to p&id

1 Like

p&id pipes have this built in. When a p&id segment crosses another p&id segment a gap is drawn. mimic and simple pipes do not have this.

The gap is determined by the pipe’s z-index, which is the individual pipe’s position within the props.pipes array. Among connections, it’s determined by each of it’s ancestor’s indexes within their connection array

An easy way to visualize this is to use a connection address derived from the pipe index, then connection indexes
[0,1,0] would represent the first pipe, second connection(array indexes start at 0), then first sub connection

that would be displayed on top of a connection with address [0,0,0] (first pipe, first connection, first sub connection.

More complex example:
[0,0] ← segment at the bottom of the z-index
[1,1] ← segment at the top of the z-index

1 Like

simple and mimic pipes have a built in rounded corners. p&id pipes have rounded corners when the segments are not all at 90deg increments to eachother. It would be an easy enhancement to add an appearance boolean prop in the future to make these corners always rounded.

One future enhancement would be the ability to convert the pipes to a SVG. That way you could display one version of the pipes for 5:4 and one for 16:9. That would give you total control over the pipes placement in different aspect modes. It’s possible to do this through the client, by right clicking and saving the SVG, but that isn’t user friendly :sweat_smile:

As it stands now, a conversion takes place when switching between aspect modes. This conversion is (almost) the same code that does the conversion of component position props when switching aspect modes. However this does leave much to be desired for Symbols… because symbols have built in aspect ratios which cause the “natural” snap points to move within them as they are resized. This is one limitation I ran into when developing piping.

Sounds good! Are these gaps visible in the screenshots though as I don’t see any?


Sorry, they weren’t present in my initial set of screenshots because none of them had p&id pipes overlapping

Here’s a screenshot from my test project demonstrating them


Awesome, looks good :slight_smile: I don’t suppose the gap is configurable? Sometimes you might want to pronounce the gap to make it more obvious. I’ve definitely had operators complain before that my gaps weren’t big enough

1 Like

The gaps aren’t currently configurable, but that’s a great idea and easy to implement in the future.


Is it possible to add a configurable property for defining the pipe radius for any bend degree?
Some times we need very large radius in middle of the pipe.

not in the current implementation/data model.

A bezier or quadratic curve sounds ideal for your use case, but that would be difficult to work into our data model which is based on a tree of points