SKYDRAWING
This library handles exportable drawings like PDF or DXF.
Drawing
Drawings are defined as a collection of pages containing layouts. Create a drawing as:
const drawing = new SKYDRAWING.Drawing()
However a drawing itself requires:
- pages to be shown through
drawing.addPage()
. - content/layout in pages to be shown through
drawing.addContent()
.
addPage()
A drawing requires pages, which are used to add the content (as layouts). A drawing with 3 different pages would be like:
drawing.addPage(1, { margin: 10, pageHeight: 210, pageWidth: 297 })
drawing.addPage(2, { margin: 15, pageHeight: 297, pageWidth: 420 })
drawing.addPage(3)
Optional arguments, that are not defined, take the value of the drawing's as default.
Below we have listed the most common page sizes:
const pageSizes = [
{ format: 'A4', pageWidth: 297, pageHeight: 210 },
{ format: 'A3', pageWidth: 420, pageHeight: 297 },
{ format: 'A2', pageWidth: 594, pageHeight: 420 },
{ format: 'A1', pageWidth: 841, pageHeight: 594 },
]
addContent()
The content of a drawing is nothing more than a layout. In order to add a layout in a drawing, drawing.addContent()
has to be used indicating in which page you want to add this layout. Therefore a page needs to exist (i.e.
drawing.addPage()
needs to be used before). These are the most common examples of use:
- By using position & scale:
position
sets the real position of the layout in the page.scale
changes the scale of the layout when added to the drawing.showScale
shows the label of the scale (e.g.1:10
) below the layout.textSize
sets the size of all text presented in the layout, regardless ofscale
drawing.addContent(pageNr1, myLayout, {
position: new SKYMATH.Vector2D(0.1 * pageWidth, 0.2 * pageHeight),
scale: 0.1,
showScale: true,
textSize: 3,
}) - By using position & align:
position
sets the real position of the layout in the page.align
aligns the layout based on the position (ifposition
is used).
drawing.addContent(pageNr1, myLayout, {
position: new SKYMATH.Vector2D(0.1 * pageWidth, 0.2 * pageHeight),
align: {
horizontal: 'center', // can be: 'left', 'center' or 'right'
vertical: 'center', // can be: 'top', 'center' or 'bottom'
ignoreAnnotations: false, // ignores text and dimensions in layouts for positioning
},
}) - By using only align (typically for tables on corners)
align
aligns the layout based on the drawing page.
drawing.addContent(pageNr1, myLayout, {
align: {
horizontal: 'right', // can be: 'left', 'center' or 'right'
vertical: 'top', // can be: 'top', 'center' or 'bottom'
},
}) - By using autoscaling within bounds:
fitInside
autofits a layout within given real drawing-bounds and a list of scales.align
sets the layout position according to the bounds (iffitInside
is used).scale
andscaleLabel
are given accordingly (iffitInside
is used).textSize
sets the size of all text presented in the layout, regardless ofscale
const { scale, scaleLabel } = drawing.addContent(1, layout, {
fitInside: {
bounds: new SKYCAD.Bounds2D(new SKYMATH.Vector2D(10, 10), new SKYMATH.Vector2D(0.60 * pageWidth, pageHeight - 10)),
validScales: [1/10, 1/20, 1/30, ...]
},
align: {
horizontal: 'center',
vertical: 'center',
ignoreAnnotations: true,
},
textSize,
})
You can give a custom list of scales in
validScales
. Otherwise, if it is undefined it takes the values according of the ISO standard of scales. See thatscale
andscaleLabel
can be used for further use (e.g. adding more content withscale
or even usescaleLabel
for the header later).When using
fitInside
, notice that these bounds show up as a dashed-grey rectangle in the editor (highlighted with orange arrows in picture below for in this case: watermark, all views, and picture taken from UI respectively), providing you with a better visual feedback of possible overlapping bounds or even with layouts with dynamic content like the pictures taken from UI.
Header
A header is presented as a table converted into a layout. Create a simple version of it as:
const dateString = new Date().toISOString().split('T')[0] // simplified date
const headerLayout = SKYDRAWING.generateSimpleHeader({
date: dateString,
pageNr: '1 of 1',
projectId: 'Project Docs',
quotationId: 'Q14-0198',
scale: '1 : 20',
width: 30,
})
This simple version is a layout already, so all the functionalities of the layouts can be used here, such as
headerLayout.scaleContent(0.75)
and others.
However, you might want to create your own table. To do so, create a header as a table first and then convert it into a layout. As an example wrapped in a function:
function getHeaderLayout() {
const dateString = new Date().toISOString().split('T')[0] // simplified date
const table = new SKYCAD.Table({ defaultTextSize: 3 })
table.addText('1 : 1', 0, 0, { label: 'Scale' })
table.addText('My coaster', 1, 0, { label: 'Project id' })
table.addText(dateString, 2, 0, { label: 'Date' })
table.addText('1 of 1', 3, 0, { label: 'Page' })
const headerLayout = table.generateLayout()
return headerLayout
}
Add Header To Page
drawing.setHeader(1, headerLayout, { anchor: 'bottom-right' })
drawing.setHeader(2, headerLayout, { anchor: 'top-right' })
Only one header can be added to a page. If more tables (ex. BOM or manufacturing lists) are to be added, these should be done through
drawing.addContent()
instead.
Example
Below a simple example of a coaster using a circular pattern is presented:
function generateDrawing(component) {
const drawing = new SKYDRAWING.Drawing()
// Page
const firstPage = 1
drawing.addPage(firstPage, { pageHeight: 210, pageWidth: 297, frame: 'Grid' }) // A4 size
// Content
const layout = component.getLayoutForDrawing()
const dimensionLayout = component.getSketch()
layout.addLayout(dimensionLayout)
drawing.addContent(firstPage, layout, { scale: 1, anchor: 'center' })
// Header
const dateString = new Date().toISOString().split('T')[0] // simplified date
const headerLayout = SKYDRAWING.generateSimpleHeader({
date: dateString,
pageNr: '1 of 1',
projectId: 'My coaster',
scale: '1 : 1',
})
headerLayout.scaleContent(0.5)
drawing.setHeader(firstPage, headerLayout, { anchor: 'bottom-right' })
return drawing
}
Export
The drawing can be exported as either PDF or DXF, but the raw data can be extracted directly from the function
generateDrawing()
used in the DrawingMaker (DRAWING). For example, if the drawing is meant to be used and
downloaded in the app, then the drawing could be easily extracted by exporting the component COASTERDRAWING
into the
app and use the function like:
const drawing = COASTERDRAWING.generateDrawing()
If you want to download the PDF or DXF files, you can check this section