Working with Visio Shape Data

Adding a New Shape in Visio

Aspose.Diagram for Java allows you to manipulate Microsoft Visio diagrams in different ways. One of the things you can do is add new shapes to a diagrams. Aspose.Diagram for Java lets you to add a new shape to a diagram. The added shape can also be customized using Aspose.Diagram for Java.

This topic describes how to add a new rectangle shape to a diagram.

Use Aspose.Diagram for Java’s API to create new shapes and then add these shapes to a diagram’s shapes collection.

To add a new shape:

  1. Find the page - Each Visio diagram contains a collection of pages. Developers may retrieve the page by page ID or Name and store the required page in the Page class object.
  2. Add the require Master of a Shape - Each Visio diagram contains a collection of masters. Developers may add a Master (by ID or Name) from the existing stencil file (by direct path or file stream).
  3. Add shape in the Visio diagram - Developers can place a new shape in the Visio diagram by page index (starting from 0), master name, PinX, PinY, height (optional) and width (optional).
  4. Set shape properties - AddShape method of the Diagram class returns the shape ID. Developers can retrieve shape from a Visio diagram by using this ID, and then set its properties, e.g. color, position, alignment and text.

The input diagram

todo:image_alt_text

The diagram with a shape added

todo:image_alt_text

Add Programming Sample

The code snippet below shows how to do each step.

Retrieving Shape Information

Working with Diagrams explains how to create diagrams, add shapes and connectors, and then how to retrieve information about diagram elements such as pages, masters, connectors and fonts. This article looks at how to retrieve information about shapes in a diagram.

Each shape in a diagram has an ID and a name. The ID is important when programming with Visio: it is the main method for accessing a shape. Each shape also retains information about what master (stencil) it is made from.

A Shape is an object in a Visio drawing. The Shapes property, exposed by the Page class, supports a collection of Aspose.Diagram.Shape objects. The Shapes property can be used to retrieve information about a shape.

In the console window below, for example, you can see information output for a diagram that contained four shapes: two terminators, a process and a dynamic connector. Each has a unique ID as well as the name of the master (stencil) shape.

A console window showing shape information

todo:image_alt_text

To retrieve Visio page information:

  1. Loads a diagram.
  2. Sets up a foreach loop to loop through all the shapes in the diagram.
  3. Displays shape information.

Retrieve Programming Sample

The following piece of code retrieve the shape information from a Visio diagram.

Copy Shapes from an Existing Visio

Aspose.Diagram for Java API allows developers to copy shapes from the source Visio page to the new Visio diagram page. It also supports copying group shapes. This article describes how to copy all shapes from the the source diagram page.

To copy shapes, developers should also copy source PageSheet and source Visio themes to preserve shape fill style and other formatting properties.

This example work as follows:

  1. Load a source Visio.
  2. Initialize a new Visio
  3. Add masters and themes from the source Visio.
  4. Get page from the source Visio.
  5. Copy its PageSheet to the new Visio Page.
  6. Iterate through the shapes of the source Visio page.
  7. Set its new id and add to the new Visio page.
  8. Save the new Visio in the local storage.

Copy Programming Sample

Copy a Visio Shape to another Shape instance

The copy method of the Shape class takes a shape instance to clone.

 // import diagram

Diagram diagram = new Diagram(dataDir + "Drawing1.vsdx");

Shape newShape = new Shape();

// copy diagram

newShape.copy(diagram.getPages().get(0).getShapes().get(0));

newShape.setID(3);

newShape.getXForm().getPinX().setValue(1);

newShape.getXForm().getPinY().setValue(1);

Reading Visio Shape Data

The Props collection exposed by the Shape class supports the Aspose.Diagram.Prop object. The property can be used to read a shape’s data (custom properties).

Read All Shape Properties

To identify custom properties in Microsoft Visio:

  1. In a diagram, right-click a shape.
  2. Select Data, then Shape Data from the menu. Any existing properties are listed in the dialog.
A shape’s data, as seen in Microsoft Visio. ** 
todo:image_alt_text  
A console window showing the shape data output. ** 
todo:image_alt_text  

Read Programming Sample

The code snippets below reads shape data (custom properties).

Read a Shape Property by Name

The code snippet below reads a shape property by name (custom property).

Read by Name Programming Sample

Use Connection indexes to connect shapes

Aspose.Diagram for Java API already allows developers to add new connecting points on the shape, and developers can now connect shapes using connection indexes.

Use Connection indexes to connect shapes

The connectShapesViaConnectorIndex member exposed by the Page class can be used to connect shapes using connection indexes. The following code shows how to connect shapes:

  1. Initialize a new drawing.
  2. Place four rectangle shapes
  3. Add two additional connection points, so that there would be three connection points on the bottom border line
  4. Connect first shape from each bottom connection to other three rectangle shapes from Top with dynamic connectors
  5. Save drawing

Use connection indexes to connect shapes Programming Sample

Use the following code in your Java application to connect shapes using connection indexes with Aspose.Diagram for Java API.

Java

 // initialize a new drawing

Diagram diagram = new Diagram();

// get page by index

Page page = diagram.getPages().get(0);

// add masters

String connectorMaster = "Dynamic connector", rectangle = "Rectangle";

int pageNumber = 0;

double width = 2, height = 2, pinX = 4.25, pinY = 9.5;

diagram.addMaster("C:\\temp\\Basic Shapes.vss", rectangle);

diagram.addMaster("C:\\temp\\Basic Shapes.vss", connectorMaster);

// add shapes

long shape1_ID = diagram.addShape(4.5, 7, rectangle, pageNumber);

long shape2_ID = diagram.addShape(2.25, 4.5, rectangle, pageNumber);

long shape3_ID = diagram.addShape(4.5, 4.5, rectangle, pageNumber);

long shape4_ID = diagram.addShape(6.75, 4.5, rectangle, pageNumber);

// get shapes by ID

Shape shape1 = page.getShapes().getShape(shape1_ID);

Shape shape2 = page.getShapes().getShape(shape2_ID);

Shape shape3 = page.getShapes().getShape(shape3_ID);

Shape shape4 = page.getShapes().getShape(shape4_ID);

// add two more connection points

Connection connection1 = new Connection();

connection1.getX().getUfe().setF("Width*0.33");

connection1.getY().getUfe().setF("Height*0");

Connection connection3 = new Connection();

connection3.getX().getUfe().setF("Width*0.66");

connection3.getY().getUfe().setF("Height*0");

shape1.getConnections().add(connection1);

shape1.getConnections().add(connection3);



// add connector shapes

Shape connector1 = new Shape();

Shape connector2 = new Shape();

Shape connector3 = new Shape();

long connecter1Id = diagram.addShape(connector1, connectorMaster, 0);

long connecter2Id = diagram.addShape(connector2, connectorMaster, 0);

long connecter3Id = diagram.addShape(connector3, connectorMaster, 0);

// connect shapes by index of conneecting points

page.connectShapesViaConnectorIndex(shape1.getID(), 6, shape2.getID(), 3, connecter1Id);

page.connectShapesViaConnectorIndex(shape1.getID(), 1, shape3.getID(), 3, connecter2Id);

page.connectShapesViaConnectorIndex(shape1.getID(), 7, shape4.getID(), 3, connecter3Id);

// save drawing

diagram.save("C:\\temp\\Drawing1_out.vsdx", SaveFileFormat.VSDX);

Retrieve the Parent Shape of a Sub-Shape

Aspose.Diagram for Java allows developers to retrieve the parent shape of a sub-shape.

Get the Parent Shape

The Shape class offers getParentShape property to retrieve the parent shape.

Get the Parent Shape Programming Sample