Model Based Definitions (MBD) 3D PDF Document Generation

What is MBD?

The MBD idea of Model Based Definitions for CAD, involves using CAD system agnostic digital drawing files where not only the 3D geometric part shapes, designs are present, but further the tolerance, annotations, key design data required to fully interpret the 3D drawing. An MBD enabled drawing enables the capture of design configurations, performance requirements, manufacturing procedures, quality controls and maintenance procedures. As an illustration, a design consisting of many integrated parts could contain 3D views of the whole and each individual part, with bill-of-materials (BOM) data linked in a way that users can apply to production workflows.  When MBD documents are used within an enterprise workflow, a key feature of the related term Model Based Enterprise (MBE) process is enabled.

What does MBD with 3D PDF actually do?

A 3D PDF document in general contains both 2D page contents and one or more 3D view ports, where 3D CAD models can be manipulated with zoom, rotate and layer visibility explored. Having MBD characteristics means more, that by part selection and menus, the names, part data, attribute properties and dimensions are also available. By clicking on the 3D part, or by clicking on a part list or some other type of attribute list, the associated 3D part can be highlighted and better understood. An MBD enhanced 3D PDF document enables production workflows.

Who needs MBD?

Where documents are created and shared in a work group, to management or to external subcontractors or supply chain organizations, MBD enabled 3D PDF documents are ideal for communication and collaboration. A designer obtaining quotes from a manufacturer, or an inspection engineer checking if the production models are consistent with a specification can use a CAD system neutral 3D PDF as a reference.

MBD Demo Creation Process

In Model Based Definitions (MBD), CAD 3D Models such as this edge clamp design may be represented in 3D PDF with additional interactive layers to show geometric size dimensions and properties, often known as PMI. The 3D PDF is produced using PDF3D ReportGen from Visual Technology Services. Using the Adobe Reader or similar 3D PDF enabled viewer mouse pan, zoom and animation is available in a special illustration view-port inside the document page.  Left mouse button rotates around, while right mouse (or Shift-Mouse on Mac) zooms in.

The 3D model design is for a clamp for precision wood-working such as repairing lutes, mandolins, violins and acoustic guitars. The dual C-Clamp with deep throw is suitable for repairing cracks in thin sound boards. In this example the model is shown as defined in a STEP 214 CAD file (ISO-10303-21), originally authored in SolidWorks. This small simple model with very clear visual structure was selected to demonstrate the key ideas of 3D PDF MBD generation. The images and 3D model data files are copyright and used courtesy of Akar Ki and are available at luthier-s-edge-clamp-1.

The demo integrates these MBD-style features:

  • STEP AP214 3D CAD Model Conversion to 3D PDF
  • Cross-Highlight interaction between 3D and parts list
  • Part MetaData embedded in PDF, dynamically displayed
  • PMI Dimensions Visible using GD&T techniques
  • Part Isolation option to remove surrounding clutter
  • Template Design for branding, house style, background information
  • Integration of XML, JavaScript, optionally C++ for automated production

Create Static Background Layout

A static background PDF with the layout design and graphical page elements are prepared using MS-Word and the PDF3D with OFFICE plugin. This establishes a PDF look and feel, with a placeholder layout for where the 3D view will go. The background PDF may be created with almost any PDF generator, including 2D drawing page PDF export from mainstream CAD packages.

Add MetaData to Parts

Metadata is added to key parts in the 3D model. By using the STEP part model names, properties, attributes and other BOM information can be attached. Almost any type of information can be added, using a simple key-value pair list for each part. By using typical database lookup or spreadsheet lists, simple XML tags can be inserted. The number of entries for each part is arbitrary, can be none or a large number. In this demonstration the JavaScript assumes there will be “Alias”, “PMI*” and “IsolatedView” tags to enable the cross-highlight and part data display logic. The metadata information can be added in XML, or C++:

 

XML:

<Metadata nodeName=”c_clamp“>

<MetadataItem key=”Alias” value=”C-Clamp Assy #1″/>

<MetadataItem key=”ID” value=”5928375“/>

<MetadataItem key=”Type” value=”RectBlock”/>

<MetadataItem key=”Material” value=”Brass”/>

<MetadataItem key=”StockCode” value=”CC0101″/>

<MetadataItem key=”Revision” value=”1.0″/>

<MetadataItem key=”PMI_START” value=”39″/>

<MetadataItem key=”PMI_END” value=”43″/>

<MetadataItem key=”IsolatedView” value=”ISO For c_clamp”/>

….

</Metadata>

<Metadata nodeName=”rod_8mm“>

<MetadataItem key=”Alias” value=”Rod 8mm #1″/>

<MetadataItem key=”ID” value=”2358380″/>

<MetadataItem key=”Type” value=”Cylinder”/>

<MetadataItem key=”Material” value=”Steel”/>

<MetadataItem key=”StockCode” value=”RD0101″/>

<MetadataItem key=”Revision” value=”1.0″/>

<MetadataItem key=”PMI_START” value=”74″/>

<MetadataItem key=”PMI_END” value=”78″/>

<MetadataItem key=”IsolatedView” value=”ISO For rod_8mm”/>

….

</Metadata>

….

C++:

PDF3DMetadataItem metadataItem;
metadataItem.modelName = PDF3DString(“c_clamp“);
metadataItem.metadata.insert(std::pair<PDF3DString,PDF3DString>(“ID“,”5928375“);

Draw Title Box

Next some program-generated document, project and title information can be added into an informative block on the PDF page. This is inserted into the template when the 3D PDF is generated, rather than remaining part of the static background template. The title block can be added using either XML or C++:

XML:

<DrawTextRect alignment=”Left Top” bottom=”80“ wordWrap=”true“ drawBox=”true“

rotationAlignment=”Left Top” width=”250“ rotation=”0″ height=”170″ left=”30“

value=”Date:22/01/2017…Author:…“>

<Font underline=”false” italic=”false” size=”14“   file=”” bold=”true” family=”Arial”/>

<Color alpha=”255″ blue=”80″ red=”20″ green=”20″/>

</DrawTextRect>

C++:

PDF3DTextBoxWidget textBox(&exporter);
textBox->SetText(“Date:22/01/2017…\nAuthor:…“);
textBox->SetMultiLine(true);
textBox->SetScrollBarsEnabled(true);
exporter.DrawWidget(PDF3DRect(x, y, w, h), textBox);

Add Part List Box

For the model assembly tree, identify or import the names of primary parts. These names can be used to establish an interactive parts list created as a PDF form block. Each part is a row in the list, and bin-directional linked selection enables either clicking on the name in the part list or the visible part in the 3D view. Once selected, PMI graphical representation showing dimensions appears in 3D, and further part metadata is updated in a further list field. For technical reasons the actual model tree part name may be hard for users to understand, so an “alias” human friendly descriptive part name is used in the part list. The alias is one of the items stored in the part metadata.

The parts list is created with the process of:

  1. Draw ListBox on PDF page
  2. Traverse Model to Find Nodes with MetaData
  3. Show “Alias” part names from MetaData
  4. Add Cross-Highlight Events to couple list with 3D scene

XML:

<WidgetListBox name=”partlistWidgetListBox” selectedItem=”” multiSelect=”false“

toolTip=“-” commitOnSelectionChange=”true” sorted=”false”>

<Rectangle>

<Position bottom=”80″ left=”300″/>

<Size width=”250″ height=”170″/>

</Rectangle>

<Script>

var value = event.target.value;

var assemblyName = getField(“partlistWidgetListBox”).getItemAt(value,false);

var pageIndex = this.pageNum;

var c3d = this.getAnnots3D(pageIndex)[0].context3D;

c3d.showFromPartList(assemblyName);

dirty=false;

</Script>

</WidgetListBox>

C++:

  1. PDF3DListBoxWidget class
  2. Add JavaScript with: exporter.AddDocumentLevelJavaScript()

Add MetaData List Box

Next to the part list, a further list is added to the PDF to show part information data, or metadata. The structure is very similar to the part list, but this time special interactive behaviour is simplified as the content is populated dynamically by other part selection events, either by the parts list or the 3D view mouse part selections.

XML:

<WidgetListBox name=“metadataWidgetListBox”

selectedItem=“-” multiSelect=”false“    toolTip=”” commitOnSelectionChange=”true“   sorted=”false”>

<Rectangle>

<Position bottom=”80″ left=”570″/>

<Size width=”250″ height=”170″/>

</Rectangle>

<Script> /* no script, here */ </Script>

</WidgetListBox>

On Part Selection Event responsible for Populate Display:

hf = host.getField(“metadataWidgetListBox”);

hf.clearItems();

for(var i = 0; pmi_table[j].length > i; i++) {

hf.insertItemAt(pmi_table[j][pmi_table.length – i],i);

}

C++:

PDF3DListBoxWidget class

Add Isolate Button

Next a button is added to enable uses to “Isolate” the selected part, leaving it visible while all other parts are temporarily hidden. This is added by using the PDF push button with a custom javascript action. The isolation can be done in either of two ways, first simply write a JavaScript method to loop over all parts and change visibility to false to hide them, or as used in this project set up views for each part, where the view is created to specify parts which should be visible or invisible when the view is established. Using this second method, the JavaScript is very simple, just setting the scene to the view containing the isolation rules. The relevant view name is associated with the part requiring isolation by storing the view name as additional part metadata.

 

 

  1. Draw Button on PDF page
  2. Lookup Select Part from List Widget
  3. Find Isolated View Name from Metadata
  4. Launch Isolated View

XML:

<WidgetPushButton name=”button_isolate

readOnly=”false” caption=”Isolate”>

<Script>

var pageIndex = this.pageNum;

var c3d = this.getAnnots3D(pageIndex)[0].context3D;

var value=getField(“partlistWidgetListBox“).value;

var partName=getField(“partlistWidgetListBox“).getItemAt(value,false);

c3d.isolate(partName); // runtime.setView() to hide the rest

dirty=false;

</Script>

</WidgetPushButton>

C++:

PDF3DPushButtonWidget class

Add Dimensional GD&T Markup PMI

The PMI annotations in the 3D view are internally generated in this demo by traversing the CAD model hierarchy to annotate the overall part sizes. PMI may also be explicitly specified with futher XML tags, or by using an integration bridge supporting PMI import from an existing source.

Conclusion

Pull the demo PDF into your local Adobe Reader and experience the MBD navigation, at: MBD_Demo.pdf

This introduction and demonstration of creating a new 3D PDF MBD style document shows the creation of features above and beyond typical simple 3D file conversions to 3D PDF. In particular it adds semantic relationships and interaction between each 3D part and a corresponding parts list and part data, reveals dimensional PMI for selected parts, and lets users see each part in isolation when needed. The MBD demonstration steps are open and flexible to be applied to a wide variety of document styles and data sources, using programming language agnostic XML tags and simple generic JavaScript snippets. The live demonstration steps are included within the PDF3D software packages. Trial evaluations are available on request.