2022-11-06 03:37:52 +00:00
/ *
altium . js schematic renderer
Copyright ( c ) 2022 Graham Sutherland
Permission is hereby granted , free of charge , to any person obtaining
a copy of this software and associated documentation files ( the
"Software" ) , to deal in the Software without restriction , including
without limitation the rights to use , copy , modify , merge , publish ,
distribute , sublicense , and / or sell copies of the Software , and to
permit persons to whom the Software is furnished to do so , subject to
the following conditions :
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software .
THE SOFTWARE IS PROVIDED "AS IS" , WITHOUT WARRANTY OF ANY KIND ,
EXPRESS OR IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY , FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT . IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM , DAMAGES OR OTHER LIABILITY , WHETHER IN AN ACTION
OF CONTRACT , TORT OR OTHERWISE , ARISING FROM , OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE .
* /
2024-03-24 15:41:03 +00:00
2022-11-06 03:37:52 +00:00
class AltiumSchematicRenderer
{
constructor ( canvas , document )
{
this . canvas = canvas ;
this . document = document ;
2024-03-02 01:40:02 +00:00
this . graph = null
2022-11-06 03:37:52 +00:00
}
# altiumColourToHex ( colourInt )
{
return "#" + ( colourInt & 0xFF ) . toString ( 16 ) . padStart ( 2 , '0' ) + ( ( colourInt >> 8 ) & 0xFF ) . toString ( 16 ) . padStart ( 2 , '0' ) + ( ( colourInt >> 16 ) & 0xFF ) . toString ( 16 ) . padStart ( 2 , '0' ) ;
}
# shouldShow ( object )
{
if ( object . owner _part _id == null || object . owner _part _id < 1 )
return true ;
const parent = object . find _parent ( AltiumComponent ) ;
if ( parent == null )
return true ;
if ( parent . current _part _id == null || parent . current _part _id < 1 )
return true ;
return parent . current _part _id == object . owner _part _id ;
}
2024-03-24 15:41:03 +00:00
delete _select _cop ( ) { // 删除选中器件
this . graph . removeCells ( ) ;
}
2024-03-02 01:40:02 +00:00
render ( ) {
2024-03-05 05:44:11 +00:00
2024-03-24 15:41:03 +00:00
this . graph = new mxGraph ( document . getElementById ( 'graphContainer' ) ) ;
mxConnectionHandler . prototype . movePreviewAway = false ;
mxConnectionHandler . prototype . waypointsEnabled = true ;
mxGraph . prototype . resetEdgesOnConnect = true ;
mxConstants . SHADOWCOLOR = '#C0C0C0' ;
var joinNodeSize = 4 ;
var strokeWidth = 2 ;
// Enables guides
mxGraphHandler . prototype . guidesEnabled = false ;
// Alt disables guides
mxGuide . prototype . isEnabledForEvent = function ( evt )
{
return ! mxEvent . isAltDown ( evt ) ;
} ;
// Enables snapping waypoints to terminals
mxEdgeHandler . prototype . snapToTerminals = true ;
mxEdgeStyle . WireConnector = function ( state , source , target , hints , result )
{
mxLog . debug ( 'add waypoint' ) ;
mxLog . debug ( "WireConnector" , state , source , target , hint )
// Creates array of all way- and terminalpoints
var pts = state . absolutePoints ;
var horizontal = true ;
var hint = null ;
// Gets the initial connection from the source terminal or edge
if ( source != null && state . view . graph . model . isEdge ( source . cell ) )
{
horizontal = state . style [ 'sourceConstraint' ] == 'horizontal' ;
}
else if ( source != null )
{
horizontal = source . style [ 'portConstraint' ] != 'vertical' ;
// Checks the direction of the shape and rotates
var direction = source . style [ mxConstants . STYLE _DIRECTION ] ;
if ( direction == 'north' || direction == 'south' )
{
horizontal = ! horizontal ;
}
}
// Adds the first point
// TODO: Should move along connected segment
var pt = pts [ 0 ] ;
if ( pt == null && source != null )
{
pt = new mxPoint ( state . view . getRoutingCenterX ( source ) , state . view . getRoutingCenterY ( source ) ) ;
}
else if ( pt != null )
{
pt = pt . clone ( ) ;
}
var first = pt ;
// Adds the waypoints
if ( hints != null && hints . length > 0 )
{
// FIXME: First segment not movable
hint = state . view . transformControlPoint ( state , hints [ 0 ] ) ;
mxLog . show ( ) ;
mxLog . debug ( hints . length , 'hints0.y=' + hint . y , pt . y )
if ( horizontal && Math . floor ( hint . y ) != Math . floor ( pt . y ) )
{
mxLog . show ( ) ;
mxLog . debug ( 'add waypoint' ) ;
pt = new mxPoint ( pt . x , hint . y ) ;
result . push ( pt ) ;
pt = pt . clone ( ) ;
//horizontal = !horizontal;
}
for ( var i = 0 ; i < hints . length ; i ++ )
{
horizontal = ! horizontal ;
hint = state . view . transformControlPoint ( state , hints [ i ] ) ;
if ( horizontal )
{
if ( pt . y != hint . y )
{
pt . y = hint . y ;
result . push ( pt . clone ( ) ) ;
}
}
else if ( pt . x != hint . x )
{
pt . x = hint . x ;
result . push ( pt . clone ( ) ) ;
}
}
}
else
{
hint = pt ;
}
// Adds the last point
pt = pts [ pts . length - 1 ] ;
// TODO: Should move along connected segment
if ( pt == null && target != null )
{
pt = new mxPoint ( state . view . getRoutingCenterX ( target ) , state . view . getRoutingCenterY ( target ) ) ;
}
if ( horizontal )
{
if ( pt . y != hint . y && first . x != pt . x )
{
// result.push(new mxPoint(pt.x, hint.y));
}
}
else if ( pt . x != hint . x && first . y != pt . y )
{
// result.push(new mxPoint(hint.x, pt.y));
}
} ;
mxStyleRegistry . putValue ( 'wireEdgeStyle' , mxEdgeStyle . WireConnector ) ;
let mxGraphGetCellStyle = mxGraph . prototype . getCellStyle ;
mxGraph . prototype . getCellStyle = function ( cell )
{
var style = mxGraphGetCellStyle . apply ( this , arguments ) ;
if ( style != null && this . model . isEdge ( cell ) )
{
style = mxUtils . clone ( style ) ;
if ( this . model . isEdge ( this . model . getTerminal ( cell , true ) ) )
{
style [ 'startArrow' ] = 'oval' ;
}
if ( this . model . isEdge ( this . model . getTerminal ( cell , false ) ) )
{
style [ 'endArrow' ] = 'oval' ;
}
}
return style ;
} ;
let mxConnectionHandlerCreateMarker = mxConnectionHandler . prototype . createMarker ;
mxConnectionHandler . prototype . createMarker = function ( ) {
var marker = mxConnectionHandlerCreateMarker . apply ( this , arguments ) ;
// Uses complete area of cell for new connections (no hotspot)
marker . intersects = function ( state , evt )
{
return true ;
} ;
// Adds in-place highlighting
mxCellHighlightHighlight = mxCellHighlight . prototype . highlight ;
marker . highlight . highlight = function ( state )
{
if ( this . state != state )
{
if ( this . state != null )
{
this . state . style = this . lastStyle ;
// Workaround for shape using current stroke width if no strokewidth defined
this . state . style [ 'strokeWidth' ] = this . state . style [ 'strokeWidth' ] || '1' ;
this . state . style [ 'strokeColor' ] = this . state . style [ 'strokeColor' ] || 'none' ;
if ( this . state . shape != null )
{
this . state . view . graph . cellRenderer . configureShape ( this . state ) ;
this . state . shape . redraw ( ) ;
}
}
if ( state != null )
{
this . lastStyle = state . style ;
state . style = mxUtils . clone ( state . style ) ;
state . style [ 'strokeColor' ] = '#00ff00' ;
state . style [ 'strokeWidth' ] = '3' ;
if ( state . shape != null )
{
state . view . graph . cellRenderer . configureShape ( state ) ;
state . shape . redraw ( ) ;
}
}
this . state = state ;
}
} ;
return marker ;
} ;
let mxEdgeHandlerCreateMarker = mxEdgeHandler . prototype . createMarker ;
mxEdgeHandler . prototype . createMarker = function ( )
{
var marker = mxEdgeHandlerCreateMarker . apply ( this , arguments ) ;
marker . highlight . highlight = this . graph . connectionHandler . marker . highlight . highlight ;
return marker ;
}
// Sets source terminal point for edge-to-edge connections.
mxConnectionHandler . prototype . createEdgeState = function ( me )
{
var edge = this . graph . createEdge ( ) ;
if ( this . sourceConstraint != null && this . previous != null )
{
edge . style = mxConstants . STYLE _EXIT _X + '=' + this . sourceConstraint . point . x + ';' +
mxConstants . STYLE _EXIT _Y + '=' + this . sourceConstraint . point . y + ';' ;
}
else if ( this . graph . model . isEdge ( me . getCell ( ) ) )
{
var scale = this . graph . view . scale ;
var tr = this . graph . view . translate ;
var pt = new mxPoint ( this . graph . snap ( me . getGraphX ( ) / scale ) - tr . x ,
this . graph . snap ( me . getGraphY ( ) / scale ) - tr . y ) ;
edge . geometry . setTerminalPoint ( pt , true ) ;
}
return this . graph . view . createState ( edge ) ;
} ;
// Uses right mouse button to create edges on background (see also: lines 67 ff)
mxConnectionHandler . prototype . isStopEvent = function ( me )
{
return me . getState ( ) != null || mxEvent . isRightMouseButton ( me . getEvent ( ) ) ;
} ;
// Updates target terminal point for edge-to-edge connections.
let mxConnectionHandlerUpdateCurrentState = mxConnectionHandler . prototype . updateCurrentState ;
mxConnectionHandler . prototype . updateCurrentState = function ( me )
{
mxConnectionHandlerUpdateCurrentState . apply ( this , arguments ) ;
if ( this . edgeState != null )
{
this . edgeState . cell . geometry . setTerminalPoint ( null , false ) ;
if ( this . shape != null && this . currentState != null &&
this . currentState . view . graph . model . isEdge ( this . currentState . cell ) )
{
var scale = this . graph . view . scale ;
var tr = this . graph . view . translate ;
var pt = new mxPoint ( this . graph . snap ( me . getGraphX ( ) / scale ) - tr . x ,
this . graph . snap ( me . getGraphY ( ) / scale ) - tr . y ) ;
this . edgeState . cell . geometry . setTerminalPoint ( pt , false ) ;
}
}
} ;
// Updates the terminal and control points in the cloned preview.
mxEdgeSegmentHandler . prototype . clonePreviewState = function ( point , terminal ) {
var clone = mxEdgeHandler . prototype . clonePreviewState . apply ( this , arguments ) ;
clone . cell = clone . cell . clone ( ) ;
if ( this . isSource || this . isTarget )
{
clone . cell . geometry = clone . cell . geometry . clone ( ) ;
// Sets the terminal point of an edge if we're moving one of the endpoints
if ( this . graph . getModel ( ) . isEdge ( clone . cell ) )
{
// TODO: Only set this if the target or source terminal is an edge
clone . cell . geometry . setTerminalPoint ( point , this . isSource ) ;
}
else
{
clone . cell . geometry . setTerminalPoint ( null , this . isSource ) ;
}
}
return clone ;
} ;
var mxEdgeHandlerConnect = mxEdgeHandler . prototype . connect ;
mxEdgeHandler . prototype . connect = function ( edge , terminal , isSource , isClone , me )
{
var result = null ;
var model = this . graph . getModel ( ) ;
var parent = model . getParent ( edge ) ;
model . beginUpdate ( ) ;
try
{
result = mxEdgeHandlerConnect . apply ( this , arguments ) ;
var geo = model . getGeometry ( result ) ;
if ( geo != null )
{
geo = geo . clone ( ) ;
var pt = null ;
if ( model . isEdge ( terminal ) )
{
pt = this . abspoints [ ( this . isSource ) ? 0 : this . abspoints . length - 1 ] ;
pt . x = pt . x / this . graph . view . scale - this . graph . view . translate . x ;
pt . y = pt . y / this . graph . view . scale - this . graph . view . translate . y ;
var pstate = this . graph . getView ( ) . getState (
this . graph . getModel ( ) . getParent ( edge ) ) ;
if ( pstate != null )
{
pt . x -= pstate . origin . x ;
pt . y -= pstate . origin . y ;
}
pt . x -= this . graph . panDx / this . graph . view . scale ;
pt . y -= this . graph . panDy / this . graph . view . scale ;
}
geo . setTerminalPoint ( pt , isSource ) ;
model . setGeometry ( edge , geo ) ;
}
}
finally
{
model . endUpdate ( ) ;
}
return result ;
} ;
2024-03-04 12:51:04 +00:00
// https://github.com/jgraph/mxgraph/blob/master/javascript/src/js/handler/mxGraphHandler.js#L1036
mxGraphHandler . prototype . updatePreview = function ( remote ) {
if ( this . livePreviewUsed && ! remote ) {
if ( this . cells != null )
{
this . setHandlesVisibleForCells ( this . graph . getSelectionCells ( ) , false ) ;
this . updateLivePreview ( this . currentDx , this . currentDy ) ;
}
}
else
{
this . updatePreviewShape ( ) ;
}
} ;
2024-03-09 10:13:36 +00:00
let oldMove = mxGraphHandler . prototype . mouseMove
mxGraphHandler . prototype . mouseMove = function ( sender , me ) {
2024-03-24 15:41:03 +00:00
// mxLog.debug("mouse move",sender,me)
2024-03-09 10:13:36 +00:00
// https://github.com/jgraph/mxgraph/blob/master/javascript/src/js/handler/mxGraphHandler.js#L901
if ( ! this . livePreviewUsed && this . shape == null ) {
this . shape = this . createPreviewShape ( this . bounds ) ;
} else if ( this . shape != null ) {
2024-03-24 15:41:03 +00:00
// mxLog.debug("mouseMove",this)
2024-03-09 10:13:36 +00:00
}
oldMove . call ( this , sender , me ) ;
}
let oldClick = mxGraphHandler . prototype . mouseDown
2024-03-24 15:41:03 +00:00
mxGraphHandler . prototype . mouseDown = function ( sender , me ) {
mxLog . debug ( "mouse down" , sender , me , this . graph . getSelectionCells ( ) )
if ( this . graph . getSelectionCells ( ) . length > 0 )
this . graph . clearSelection ( )
2024-03-09 10:13:36 +00:00
// https://github.com/jgraph/mxgraph/blob/master/javascript/src/js/handler/mxGraphHandler.js#L901
if ( me . state != undefined ) {
if ( me . state . cell . children != undefined ) {
oldClick . call ( this , sender , me ) ;
} else {
2024-03-24 15:41:03 +00:00
mxLog . debug ( me . state . cell )
2024-03-09 10:13:36 +00:00
if ( me . state . cell . parent != undefined ) {
this . graph . addSelectionCell ( me . state . cell . parent )
oldClick . call ( this , sender , me ) ;
}
// oldClick.call(this, sender, me);
}
}
}
let oldMouseUp = mxGraphHandler . prototype . mouseUp
2024-03-24 15:41:03 +00:00
mxGraphHandler . prototype . mouseUp = function ( sender , me ) {
mxLog . debug ( "mouse up" , sender , me )
2024-03-09 10:13:36 +00:00
// https://github.com/jgraph/mxgraph/blob/master/javascript/src/js/handler/mxGraphHandler.js#L901
if ( me . state != undefined ) {
if ( me . state . cell . children != undefined ) {
oldMouseUp . call ( this , sender , me ) ;
} else {
if ( me . state . cell . parent != undefined ) {
this . graph . addSelectionCell ( me . state . cell . parent )
2024-03-24 15:41:03 +00:00
// oldMouseUp.call(this, sender, me);
2024-03-09 10:13:36 +00:00
}
// oldClick.call(this, sender, me);
}
}
oldMouseUp . call ( this , sender , me ) ;
}
2024-03-07 16:28:47 +00:00
2024-03-24 15:41:03 +00:00
2024-03-02 01:40:02 +00:00
this . graph . setPanning ( true ) ;
this . graph . setConnectable ( true ) ;
this . graph . setConnectableEdges ( true ) ;
this . graph . setDisconnectOnMove ( false ) ;
this . graph . foldingEnabled = false ;
this . graph . gridSize = 1
//Maximum size
2024-03-06 15:40:58 +00:00
this . graph . maximumGraphBounds = new mxRectangle ( 0 , 0 , 1920 , 1024 )
2024-03-03 05:14:38 +00:00
this . graph . border = 0 ;
2024-03-02 01:40:02 +00:00
var fontColor = '#FFFFFF' ;
var strokeColor = '#C0C0C0' ;
var fillColor = '#C0C0C0' ;
// Panning handler consumed right click so this must be
// disabled if right click should stop connection handler.
this . graph . panningHandler . isPopupTrigger = function ( ) { return false ; } ;
// Enables return key to stop editing (use shift-enter for newlines)
this . graph . setEnterStopsCellEditing ( true ) ;
// Adds rubberband selection
new mxRubberband ( this . graph ) ;
2024-03-24 15:41:03 +00:00
this . graph . addListener ( mxEvent . CLICK , function ( sender , evt ) {
2024-03-04 12:51:04 +00:00
var e = evt . getProperty ( 'event' ) ; // mouse event
var cell = evt . getProperty ( 'cell' ) ; // cell may be null
if ( cell != null )
{
// Do something useful with cell and consume the event
// evt.consume();
}
} ) ;
var connectionHandlerMouseUp = this . graph . connectionHandler . mouseUp ;
2024-03-24 15:41:03 +00:00
this . graph . connectionHandler . mouseUp = function ( sender , me ) {
2024-03-04 12:51:04 +00:00
if ( this . first != null && this . previous != null )
{
var point = mxUtils . convertPoint ( this . graph . container , me . getX ( ) , me . getY ( ) ) ;
var dx = Math . abs ( point . x - this . first . x ) ;
var dy = Math . abs ( point . y - this . first . y ) ;
if ( dx < this . graph . tolerance && dy < this . graph . tolerance )
{
// Selects edges in non-wire mode for single clicks, but starts
// connecting for non-edges regardless of wire-mode
2024-03-24 15:41:03 +00:00
mxLog . debug ( "sss" )
2024-03-04 12:51:04 +00:00
return ;
}
}
connectionHandlerMouseUp . apply ( this , arguments ) ;
} ;
2024-03-06 15:40:58 +00:00
mxVertexHandler . prototype . rotationEnabled = false ;
2024-03-02 01:40:02 +00:00
// Alternative solution for implementing connection points without child cells.
// This can be extended as shown in portrefs.html example to allow for per-port
// incoming/outgoing direction.
this . graph . getAllConnectionConstraints = function ( terminal ) {
var geo = ( terminal != null ) ? this . getCellGeometry ( terminal . cell ) : null ;
if ( ( geo != null ? ! geo . relative : false ) &&
this . getModel ( ) . isVertex ( terminal . cell ) &&
this . getModel ( ) . getChildCount ( terminal . cell ) == 0 )
{
2024-03-24 15:41:03 +00:00
if ( terminal . cell . Pin == true ) { // a pin
mxLog . debug ( "getAllConnectionConstraints " , terminal . cell . angle )
if ( terminal . cell . angle == 90 ) {
return [ new mxConnectionConstraint ( new mxPoint ( 0 , 0 ) , false ) ] ;
} else if ( terminal . cell . angle == 180 ) {
return [ new mxConnectionConstraint ( new mxPoint ( 0 , 0 ) , false ) ] ;
} else if ( terminal . cell . angle == 270 ) {
return [ new mxConnectionConstraint ( new mxPoint ( 1 , 0 ) , false ) ] ;
} else {
return [ new mxConnectionConstraint ( new mxPoint ( 1 , 0 ) , false ) ] ;
}
}
}
if ( ( geo != null ) && ( this . getModel . isEdge ( terminal . cell ) ) ) {
console . log ( terminal . cell )
2024-03-05 05:44:11 +00:00
}
return null ;
} ;
2024-03-02 01:40:02 +00:00
// Makes sure non-relative cells can only be connected via constraints
2024-03-05 05:44:11 +00:00
this . graph . connectionHandler . isConnectableCell = function ( cell ) {
2024-03-02 01:40:02 +00:00
if ( this . graph . getModel ( ) . isEdge ( cell ) )
{
return true ;
2024-02-25 16:34:35 +00:00
}
2024-03-02 01:40:02 +00:00
else
{
var geo = ( cell != null ) ? this . graph . getCellGeometry ( cell ) : null ;
return ( geo != null ) ? geo . relative : false ;
}
} ;
2024-03-24 15:41:03 +00:00
2024-03-02 01:40:02 +00:00
var parent = this . graph . getDefaultParent ( ) ;
mxVertexHandler . prototype . livePreview = true ;
var labelBackground = ( false ) ? '#000000' : '#FFFFFF' ;
var fontColor = ( false ) ? '#FFFFFF' : '#000000' ;
var strokeColor = ( false ) ? '#C0C0C0' : '#000000' ;
var fillColor = ( false ) ? 'none' : '#FFFFFF' ;
2024-02-25 16:34:35 +00:00
2024-03-02 01:40:02 +00:00
var style = this . graph . getStylesheet ( ) . getDefaultEdgeStyle ( ) ;
delete style [ 'endArrow' ] ;
style [ 'strokeColor' ] = strokeColor ;
style [ 'labelBackgroundColor' ] = labelBackground ;
style [ 'edgeStyle' ] = 'wireEdgeStyle' ;
style [ 'fontColor' ] = fontColor ;
style [ 'fontSize' ] = '9' ;
style [ 'movable' ] = '0' ;
style [ 'strokeWidth' ] = strokeWidth ;
style [ 'rounded' ] = '0' ;
2024-03-07 16:28:47 +00:00
style [ mxConstants . STYLE _FONTSIZE ] = '11' ;
2024-03-02 01:40:02 +00:00
// Sets join node size
style [ 'startSize' ] = joinNodeSize ;
style [ 'endSize' ] = joinNodeSize ;
style = this . graph . getStylesheet ( ) . getDefaultVertexStyle ( ) ;
//style['gradientColor'] = '#909090';
style [ 'strokeColor' ] = strokeColor ;
//style['fillColor'] = '#e0e0e0';
style [ 'fillColor' ] = 'none' ;
style [ 'fontColor' ] = fontColor ;
style [ 'fontStyle' ] = '1' ;
2024-03-07 16:28:47 +00:00
style [ 'fontSize' ] = '6' ;
2024-03-02 01:40:02 +00:00
style [ 'resizable' ] = '0' ;
style [ 'strokeWidth' ] = strokeWidth ;
2024-02-25 16:34:35 +00:00
// let canvas = this.canvas;
2022-11-06 03:37:52 +00:00
let doc = this . document ;
let sheetObject = doc . objects . find ( o => o instanceof AltiumSheet ) ;
2024-02-25 16:34:35 +00:00
// canvas.style.width = sheetObject.width + "px";
// canvas.style.height = sheetObject.height + "px";
// canvas.width = sheetObject.width * window.devicePixelRatio;
// canvas.height = sheetObject.height * window.devicePixelRatio;
2022-11-06 03:37:52 +00:00
let areaColourInt = Number . parseInt ( sheetObject . attributes . areacolor , 10 ) ;
let areaColour = this . # altiumColourToHex ( areaColourInt ) ;
2024-02-25 16:34:35 +00:00
// canvas.style.backgroundColor = areaColour;
// let ctx = canvas.getContext('2d');
// ctx.scale(1, -1);
// ctx.translate(0.5, 0.5);
// ctx.translate(0, -canvas.height);
// ctx.font = "7pt sans-serif";
// ctx.textRendering = "optimizeLegibility";
// ctx.imageSmoothingQuality = "high";
// ctx.textBaseline = "bottom";
// ctx.fillStyle = areaColour;
// ctx.fillRect(0, 0, canvas.width, canvas.height);
2022-11-06 03:37:52 +00:00
let results = document . getElementById ( "results" ) ;
let sheet = doc . objects . find ( ( o ) => o instanceof AltiumSheet ) ;
let gridLight = "#eeeeee" ;
let gridDark = "#cccccc" ;
2024-02-25 16:34:35 +00:00
// ctx.lineWidth = 1;
// ctx.globalAlpha = 0.5;
2022-11-06 03:37:52 +00:00
if ( sheet . show _grid )
{
2024-02-25 16:34:35 +00:00
2022-11-06 03:37:52 +00:00
let n = 0 ;
2024-02-25 16:34:35 +00:00
// for (let x = 0; x < canvas.width; x += sheet.grid_size)
// {
// ctx.strokeStyle = ((n % 10) == 0) ? gridDark : gridLight;
// ctx.beginPath();
// ctx.moveTo(x, 0);
// ctx.lineTo(x, canvas.height);
// ctx.stroke();
// n++;
// }
// n = 0;
// for (let y = 0; y < canvas.height; y += sheet.grid_size)
// {
// ctx.strokeStyle = ((n % 10) == 0) ? gridDark : gridLight;
// ctx.beginPath();
// ctx.moveTo(0, y);
// ctx.lineTo(canvas.width, y);
// ctx.stroke();
// n++;
// }
2022-11-06 03:37:52 +00:00
}
2024-02-25 16:34:35 +00:00
// ctx.globalAlpha = 1;
2022-11-06 03:37:52 +00:00
/ *
ctx . textAlign = "center" ;
ctx . font = "bold 100px serif" ;
ctx . fillStyle = "#333300" ;
ctx . globalAlpha = 0.03 ;
ctx . save ( ) ;
ctx . rotate ( Math . PI / 4 ) ;
ctx . scale ( 1 , - 1 ) ;
for ( let y = 0 ; y < canvas . height * 2 ; y += 400 )
{
ctx . fillText ( "PREVIEW - BETA - PREVIEW - BETA - PREVIEW - BETA - PREVIEW - BETA - PREVIEW - BETA - PREVIEW - BETA - PREVIEW - BETA - PREVIEW - BETA - PREVIEW - BETA - PREVIEW - BETA - PREVIEW - BETA - PREVIEW - BETA - PREVIEW - BETA - PREVIEW - BETA - PREVIEW - BETA - PREVIEW - BETA - PREVIEW - BETA" , canvas . width / 2 , canvas . height - ( y + 200 ) ) ;
ctx . fillText ( "BETA - PREVIEW - BETA - PREVIEW - BETA - PREVIEW - BETA - PREVIEW - BETA - PREVIEW - BETA - PREVIEW - BETA - PREVIEW - BETA - PREVIEW - BETA - PREVIEW - BETA - PREVIEW - BETA - PREVIEW - BETA - PREVIEW - BETA - PREVIEW - BETA - PREVIEW - BETA - PREVIEW - BETA - PREVIEW - BETA - PREVIEW" , canvas . width / 2 , canvas . height - y ) ;
}
ctx . textAlign = "left" ;
* /
2024-03-02 01:40:02 +00:00
this . graph . getModel ( ) . beginUpdate ( ) ;
try {
let bom = [ ] ;
bom . push ( "\"designator\", \"part\", \"description\"" ) ;
for ( let obj of doc . objects . filter ( ( o ) => o instanceof AltiumDesignator ) )
2022-11-06 03:37:52 +00:00
{
2024-03-02 01:40:02 +00:00
if ( ! this . # shouldShow ( obj ) ) continue ;
let bomLine = "" ;
//let designator = doc.objects.find((des) => des instanceof AltiumDesignator && des.owner_part_id == obj.current_part_id);
let component = doc . object _from _record _index ( obj . owner _record _index ) ;
if ( component != null && component instanceof AltiumComponent )
{
bomLine += "\"" + obj . text + "\", \"" + component . design _item _id + "\", \"" + component . description . replaceAll ( "\"" , "'" ) + "\"" ;
bom . push ( bomLine ) ;
}
//bomLine += obj.description;
2022-11-06 03:37:52 +00:00
}
2024-03-02 01:40:02 +00:00
results . innerText = bom . join ( "\n" ) ;
2022-11-06 03:37:52 +00:00
2024-03-04 12:51:04 +00:00
// for (let obj of doc.objects.filter((o) => o instanceof AltiumWire))
// {
// // for (let i = 1; i < obj.points.length; i++)
// // {
// // obj.points[i].y = 840 - obj.points[i].y
// // }
// var obj1 = this.graph.getCellAt(obj.points[0].x,obj.points[0].y,parent)
// var obj2 = this.graph.getCellAt(obj.points[obj.points.length - 1].x,
// obj.points[obj.points.length - 1].y,parent)
2024-03-24 15:41:03 +00:00
// mxLog.debug(obj1,obj2)
2024-03-04 12:51:04 +00:00
// // if (!this.#shouldShow(obj)) continue;
2024-03-02 01:40:02 +00:00
2024-03-04 12:51:04 +00:00
// // ctx.strokeStyle = this.#altiumColourToHex(obj.colour);
// // ctx.lineWidth = obj.width;
// // ctx.beginPath();
// // ctx.moveTo(obj.points[0].x, obj.points[0].y);
// // for (let i = 1; i < obj.points.length; i++)
// // {
// // ctx.lineTo(obj.points[i].x, obj.points[i].y);
// // }
// // ctx.stroke();
// }
2024-03-02 01:40:02 +00:00
for ( let obj of doc . objects . filter ( ( o ) => o instanceof AltiumBus ) )
{
// if (!this.#shouldShow(obj)) continue;
// ctx.strokeStyle = this.#altiumColourToHex(obj.colour);
// ctx.lineWidth = obj.width;
// ctx.beginPath();
// ctx.moveTo(obj.points[0].x, obj.points[0].y);
// for (let i = 1; i < obj.points.length; i++)
// {
// ctx.lineTo(obj.points[i].x, obj.points[i].y);
// }
// ctx.stroke();
}
for ( let obj of doc . objects . filter ( ( o ) => o instanceof AltiumSheetSymbol ) )
{
// if (!this.#shouldShow(obj)) continue;
// ctx.fillStyle = this.#altiumColourToHex(obj.attributes.areacolor);
// ctx.fillRect(obj.attributes.location_x,
// obj.attributes.location_y- obj.attributes.ysize,
// obj.attributes.xsize, obj.attributes.ysize);
// ctx.stroke();
// ctx.strokeStyle = this.#altiumColourToHex(obj.attributes.color);
// ctx.strokeRect(obj.attributes.location_x,
// obj.attributes.location_y- obj.attributes.ysize,
// obj.attributes.xsize, obj.attributes.ysize);
// ctx.strokeStyle = "#000080";
// ctx.lineWidth = obj.width;
// ctx.beginPath();
// ctx.moveTo(obj.attributes.location_x, obj.attributes.location_y);
// ctx.lineTo(obj.attributes.location_x + obj.attributes.xsize,
// obj.attributes.location_y + obj.attributes.ysize);
// ctx.stroke();
// ctx.strokeStyle = this.#altiumColourToHex(obj.colour);
// ctx.lineWidth = obj.width;
// ctx.beginPath();
// ctx.moveTo(obj.points[0].x, obj.points[0].y);
// for (let i = 1; i < obj.points.length; i++)
// {
// ctx.lineTo(obj.points[i].x, obj.points[i].y);
// }
// ctx.stroke();
}
2024-03-03 05:14:38 +00:00
let chips = { }
2024-03-02 01:40:02 +00:00
for ( let obj of doc . objects . filter ( ( o ) => o instanceof AltiumRectangle ) )
{
obj . top = 840 - obj . top
obj . bottom = 840 - obj . bottom
2024-03-08 17:18:31 +00:00
if ( ! obj . transparent ) {
2024-03-24 15:41:03 +00:00
mxLog . debug ( 'verticalLabelPosition=top;verticalAlign=bottom;fillColor='
2024-03-08 17:18:31 +00:00
+ this . # altiumColourToHex ( obj . attributes . areacolor ) )
let v1 = this . graph . insertVertex ( parent , null , '' ,
obj . left , obj . top ,
( obj . right - obj . left ) ,
( obj . bottom - obj . top ) ,
'verticalLabelPosition=top;verticalAlign=bottom;fillColor='
+ this . # altiumColourToHex ( obj . attributes . areacolor ) ) ;
v1 . setConnectable ( false ) ;
if ( chips [ obj . owner _record _index ] == undefined ) {
chips [ obj . owner _record _index ] = [ ]
}
v1 . geometry . relative = false
chips [ obj . owner _record _index ] . push ( v1 )
2024-03-03 05:14:38 +00:00
}
2024-03-04 12:51:04 +00:00
// if (!this.#shouldShow(obj))
2024-03-02 01:40:02 +00:00
// continue;
2024-02-25 16:34:35 +00:00
// ctx.fillStyle = this.#altiumColourToHex(obj.attributes.areacolor);
// ctx.fillRect(obj.attributes.location_x,
2024-03-02 01:40:02 +00:00
// obj.attributes.location_y,
// obj.attributes.corner_x - obj.attributes.location_x, obj.attributes.corner_y - obj.attributes.location_y);
2024-02-25 16:34:35 +00:00
// ctx.stroke();
// ctx.strokeStyle = this.#altiumColourToHex(obj.attributes.color);
// ctx.strokeRect(obj.attributes.location_x,
2024-03-02 01:40:02 +00:00
// obj.attributes.location_y,
// obj.attributes.corner_x - obj.attributes.location_x, obj.attributes.corner_y - obj.attributes.location_y);
}
2024-02-25 16:34:35 +00:00
2024-03-02 01:40:02 +00:00
// todo undo
for ( let obj of doc . objects . filter ( ( o ) => o instanceof AltiumSheetEntry ) )
{
if ( ! this . # shouldShow ( obj ) ) continue ;
// ctx.strokeStyle = this.#altiumColourToHex(obj.colour);
// ctx.lineWidth = obj.width;
// ctx.beginPath();
// ctx.moveTo(obj.points[0].x, obj.points[0].y);
// for (let i = 1; i < obj.points.length; i++)
// {
// ctx.lineTo(obj.points[i].x, obj.points[i].y);
// }
// ctx.stroke();
}
for ( let obj of doc . objects . filter ( ( o ) => o instanceof AltiumTextFrame ) )
{
2024-03-07 16:28:47 +00:00
obj = obj
2024-03-02 01:40:02 +00:00
// if (!this.#shouldShow(obj)) continue;
// if (!obj.transparent)
// {
// ctx.fillStyle = this.#altiumColourToHex(obj.fill_colour);
// ctx.fillRect(obj.left, obj.top, obj.right - obj.left,
// obj.bottom - obj.top);
// }
// if (obj.show_border)
// {
// ctx.strokeStyle = this.#altiumColourToHex(obj.border_colour);
// ctx.strokeRect(obj.left, obj.top, obj.right - obj.left,
// obj.bottom - obj.top);
// }
}
2024-02-25 16:34:35 +00:00
2024-03-07 16:28:47 +00:00
2024-03-02 01:40:02 +00:00
for ( let obj of doc . objects . filter ( ( o ) => o instanceof AltiumPin ) )
{
var style = 'shape=line;fontColor=#000000;strokeColor=#000000;'
2024-03-07 16:28:47 +00:00
let name = ''
if ( obj . show _name ) {
name = obj . name
}
if ( obj . angle == 0 ) {
style = style + 'labelPosition=left;'
}
2024-03-02 01:40:02 +00:00
if ( obj . angle == 90 ) {
style += 'rotation=90'
obj . y = obj . y + obj . length / 2
obj . x = obj . x - obj . length / 2
}
if ( obj . angle == 180 ) {
2024-03-07 16:28:47 +00:00
style = style + 'labelPosition=right;'
2024-03-02 01:40:02 +00:00
obj . x = obj . x - obj . length
}
if ( obj . angle == 270 ) {
style += 'rotation=90'
obj . y = obj . y - obj . length / 2
obj . x = obj . x - obj . length / 2
}
obj . y = 840 - obj . y
2022-11-06 03:37:52 +00:00
2024-03-24 15:41:03 +00:00
// mxLog.debug(style)
2024-03-07 16:28:47 +00:00
var v11 = this . graph . insertVertex ( parent , null , name , obj . x , obj . y ,
2024-03-02 01:40:02 +00:00
obj . length , 1 ,
style ) ;
v11 . geometry . relative = false ;
v11 . setConnectable ( true ) ;
2024-03-03 05:14:38 +00:00
if ( chips [ obj . owner _record _index ] == undefined ) {
chips [ obj . owner _record _index ] = [ ]
}
2024-03-24 15:41:03 +00:00
v11 . Pin = true
v11 . angle = obj . angle
v11 . length = obj . length
mxLog . debug ( v11 . geometry . getTerminalPoint ( true ) )
2024-03-03 05:14:38 +00:00
chips [ obj . owner _record _index ] . push ( v11 )
2024-03-04 12:51:04 +00:00
2024-03-02 01:40:02 +00:00
// v11.geometry.offset = new mxPoint(-v11.geometry.width, 2); // ctx.strokeStyle = "#000000";
// ctx.beginPath();
// ctx.moveTo(obj.x, obj.y);
// ctx.lineTo(obj.x + obj.angle_vec[0] * obj.length, obj.y + obj.angle_vec[1] * obj.length);
// ctx.stroke();
2024-02-25 16:34:35 +00:00
2024-03-02 01:40:02 +00:00
// ctx.fillStyle = this.#altiumColourToHex(obj.colour);
// ctx.beginPath();
// ctx.ellipse(obj.x + obj.angle_vec[0] * obj.length, obj.y + obj.angle_vec[1] * obj.length, 5, 4, 0, 0, 2*Math.PI);
// ctx.fill();
}
2022-11-06 03:37:52 +00:00
2024-03-08 17:18:31 +00:00
for ( let obj of doc . objects . filter ( ( o ) => o instanceof AltiumEllipse ) )
{
obj = obj
obj . y = 840 - obj . y
let v1 = this . graph . insertVertex ( parent , null , '' ,
obj . x - obj . radius _x , obj . y - obj . radius _x ,
obj . radius _x * 2 , obj . radius _y * 2 , 'shape=ellipse;fillColor='
+ this . # altiumColourToHex ( obj . fill _colour ) ) ;
v1 . setConnectable ( false )
chips [ obj . owner _record _index ] . push ( v1 )
// if (!this.#shouldShow(obj)) continue;
// if (!obj.transparent)
// {
// ctx.fillStyle = this.#altiumColourToHex(obj.fill_colour);
// }
// ctx.strokeStyle = this.#altiumColourToHex(obj.line_colour);
// ctx.beginPath();
// ctx.ellipse(obj.x, obj.y, obj.radius_x, obj.radius_y, 0, 0, Math.PI*2);
// ctx.stroke();
// if (!obj.transparent)
// ctx.fill();
}
2024-03-05 05:44:11 +00:00
for ( let obj of doc . objects . filter ( ( o ) => o instanceof AltiumLine ) ) {
2024-03-06 15:40:58 +00:00
mxCellRenderer . registerShape ( 'polyline' , mxPolyline ) ;
2024-03-05 05:44:11 +00:00
obj . x2 = 840 - obj . x2
obj . y2 = 840 - obj . y2
2024-03-06 15:40:58 +00:00
style = 'shape=polyline;strokeColor=#0000ff;'
2024-03-24 15:41:03 +00:00
// mxLog.debug(style)
2024-03-06 15:40:58 +00:00
var v11 = this . graph . insertVertex ( parent , null , '' , obj . x1 , obj . x2 ,
1 , 1 , style ) ;
v11 . points = [ new mxPoint ( obj . y1 - obj . x1 , obj . y2 - obj . x2 ) ]
v11 . geometry . relative = false ;
if ( chips [ obj . owner _record _index ] == undefined ) {
chips [ obj . owner _record _index ] = [ ]
}
if ( chips [ obj . owner _record _index ] == undefined ) {
chips [ obj . owner _record _index ] = [ ]
}
v11 . setConnectable ( false ) ;
chips [ obj . owner _record _index ] . push ( v11 )
2024-03-05 05:44:11 +00:00
// 将cell设定为线段
// cell.edge = true;
// 设置起始点
2024-03-06 15:40:58 +00:00
// cell.geometry.setTerminalPoint(new mxPoint(obj.x1, obj.x2), true);
2024-03-05 05:44:11 +00:00
// 设置终结点
2024-03-06 15:40:58 +00:00
// cell.geometry.setTerminalPoint(new mxPoint(obj.y1, obj.y2), false);
2024-03-05 05:44:11 +00:00
// 使用 points 定义多个中间节点
2024-03-06 15:40:58 +00:00
// this.graph.model.root.insert(cell);
2024-03-05 05:44:11 +00:00
// this.graph.model.root.insert(cell);
// chips[obj.owner_record_index].push(cell)
2022-11-06 03:37:52 +00:00
2024-03-02 01:40:02 +00:00
// if (!this.#shouldShow(obj)) continue;
// ctx.strokeStyle = this.#altiumColourToHex(obj.colour);
// ctx.beginPath();
// ctx.moveTo(obj.x1, obj.y1);
// ctx.lineTo(obj.x2, obj.y2);
// ctx.stroke();
}
2022-11-06 03:37:52 +00:00
2024-03-02 01:40:02 +00:00
for ( let obj of doc . objects . filter ( ( o ) => o instanceof AltiumArc ) )
{
2024-03-07 16:28:47 +00:00
obj = obj
2024-03-02 01:40:02 +00:00
// if (!this.#shouldShow(obj)) continue;
// ctx.strokeStyle = this.#altiumColourToHex(obj.colour);
// ctx.lineWidth = obj.width;
// ctx.beginPath();
// ctx.arc(obj.x, obj.y, obj.radius, obj.start_angle * Math.PI/180, obj.end_angle * Math.PI/180);
// ctx.stroke();
// ctx.lineWidth = 1;
}
2022-11-06 03:37:52 +00:00
2024-03-02 01:40:02 +00:00
for ( let obj of doc . objects . filter ( ( o ) => o instanceof AltiumPolygon ) )
{
2024-03-07 16:28:47 +00:00
obj = obj
mxCellRenderer . registerShape ( 'polygon' , mxPolygon ) ;
obj . x2 = 840 - obj . x2
obj . y2 = 840 - obj . y2
style = 'shape=polygon;strokeColor=#0000ff;'
2024-03-24 15:41:03 +00:00
// mxLog.debug(style)
2024-03-07 16:28:47 +00:00
var v11 = this . graph . insertVertex ( parent , null , '' , obj . points [ 0 ] , obj . points [ 0 ] ,
1 , 1 , style ) ;
v11 . points = obj . obj . points
v11 . geometry . relative = false ;
if ( chips [ obj . owner _record _index ] == undefined ) {
chips [ obj . owner _record _index ] = [ ]
}
if ( chips [ obj . owner _record _index ] == undefined ) {
chips [ obj . owner _record _index ] = [ ]
}
v11 . setConnectable ( false ) ;
chips [ obj . owner _record _index ] . push ( v11 )
2024-03-02 01:40:02 +00:00
// if (!this.#shouldShow(obj)) continue;
// ctx.strokeStyle = this.#altiumColourToHex(obj.line_colour);
// ctx.fillStyle = this.#altiumColourToHex(obj.fill_colour);
// ctx.lineWidth = obj.width;
// ctx.beginPath();
// ctx.moveTo(obj.points[0].x, obj.points[0].y);
// for (let i = 1; i < obj.points.length; i++)
// {
// ctx.lineTo(obj.points[i].x, obj.points[i].y);
// }
// ctx.closePath();
// ctx.stroke();
// ctx.fill();
// ctx.lineWidth = 1;
}
2022-11-06 03:37:52 +00:00
2024-03-02 01:40:02 +00:00
for ( let obj of doc . objects . filter ( ( o ) => o instanceof AltiumPowerPort ) )
{
2024-03-06 15:40:58 +00:00
2024-03-02 01:40:02 +00:00
// if (!this.#shouldShow(obj)) continue;
2022-11-06 03:37:52 +00:00
2024-03-02 01:40:02 +00:00
// ctx.strokeStyle = this.#altiumColourToHex(obj.colour);
// ctx.fillStyle = this.#altiumColourToHex(obj.colour);
// ctx.lineWidth = 1;
// if (!obj.is_off_sheet_connector)
// {
// switch (obj.style)
// {
// case 2:
// ctx.beginPath();
// ctx.moveTo(obj.x, obj.y);
// ctx.lineTo(obj.x, obj.y + 10);
// ctx.stroke();
// ctx.beginPath();
// ctx.moveTo(obj.x - 5, obj.y + 10);
// ctx.lineTo(obj.x + 5, obj.y + 10);
// ctx.stroke();
// break;
// case 4:
// ctx.beginPath();
// ctx.moveTo(obj.x - 10, obj.y);
// ctx.lineTo(obj.x + 10, obj.y);
// ctx.stroke();
// ctx.beginPath();
// ctx.moveTo(obj.x - 7.5, obj.y - 2);
// ctx.lineTo(obj.x + 7.5, obj.y - 2);
// ctx.stroke();
// ctx.beginPath();
// ctx.moveTo(obj.x - 5, obj.y - 4);
// ctx.lineTo(obj.x + 5, obj.y - 4);
// ctx.stroke();
// ctx.beginPath();
// ctx.moveTo(obj.x - 2.5, obj.y - 6);
// ctx.lineTo(obj.x + 2.5, obj.y - 6);
// ctx.stroke();
// break;
// case 6:
// ctx.beginPath();
// ctx.moveTo(obj.x, obj.y);
// ctx.lineTo(obj.x, obj.y - 5);
// ctx.stroke();
// ctx.beginPath();
// ctx.moveTo(obj.x - 5, obj.y - 5);
// ctx.lineTo(obj.x + 5, obj.y - 5);
// ctx.stroke();
// for (let g = -1; g < 2; g++)
// {
// ctx.beginPath();
// ctx.moveTo(obj.x + (g * 5), obj.y - 5);
// ctx.lineTo(obj.x + (g * 5) - 3, obj.y - 10);
// ctx.stroke();
// }
// break;
// default:
// ctx.fillRect(obj.x - 10, obj.y, 20, (obj.orientation == 1) ? 10 : -10);
// break;
// }
// }
// else
// {
// ctx.save();
// ctx.translate(obj.x, obj.y);
// ctx.rotate((obj.orientation - 1) * Math.PI/2);
// ctx.beginPath();
// ctx.moveTo(0, 0);
// ctx.lineTo(-5, 5);
// ctx.stroke();
// ctx.beginPath();
// ctx.moveTo(0, 0);
// ctx.lineTo(5, 5);
// ctx.stroke();
// ctx.beginPath();
// ctx.moveTo(0, 5);
// ctx.lineTo(-5, 10);
// ctx.stroke();
// ctx.beginPath();
// ctx.moveTo(0, 5);
// ctx.lineTo(5, 10);
// ctx.stroke();
// ctx.restore();
// }
//ctx.fillText(obj.style.toString(), obj.x, obj.y);
}
2022-11-06 03:37:52 +00:00
2024-03-02 01:40:02 +00:00
// store the transform for recovery later
// let savedTransform = ctx.getTransform();
// ctx.resetTransform();
2022-11-06 03:37:52 +00:00
2024-03-02 01:40:02 +00:00
for ( let obj of doc . objects . filter ( ( o ) => o instanceof AltiumLabel ) )
{
2024-03-06 15:40:58 +00:00
obj . y = 840 - obj . y
2024-03-07 16:28:47 +00:00
if ( obj . text != undefined ) {
2024-03-24 15:41:03 +00:00
mxLog . debug ( obj . text . length )
2024-03-07 16:28:47 +00:00
var v11 = this . graph . insertVertex ( parent , null , obj . text , obj . x , obj . y - 4 ,
obj . text . length * 9 / 2 , 0 ,
2024-03-24 15:41:03 +00:00
"shape=label;fontSize=6;" ) ;
2024-03-07 16:28:47 +00:00
v11 . geometry . relative = false ;
v11 . setConnectable ( false ) ;
if ( obj . owner _record _index != 1 )
chips [ obj . owner _record _index ] . push ( v11 )
}
2024-03-06 15:40:58 +00:00
2024-03-02 01:40:02 +00:00
// if (!this.#shouldShow(obj)) continue;
// if (obj.hidden)
// continue;
// ctx.textAlign = ["left", "center", "right"][obj.justification];
// ctx.textBaseline = ["bottom", "bottom", "top", "top"][obj.orientation];
// ctx.fillStyle = this.#altiumColourToHex(obj.colour);
// ctx.save();
// ctx.translate(obj.x, canvas.height - obj.y);
// ctx.rotate(obj.orientation * -Math.PI/2);
// ctx.fillText(obj.text, 0, 0);
// ctx.restore();
}
// ctx.textAlign = "left";
// ctx.textBaseline = "bottom";
2022-11-06 03:37:52 +00:00
2024-03-02 01:40:02 +00:00
for ( let obj of doc . objects . filter ( ( o ) => o instanceof AltiumDesignator ) )
{
2024-03-07 16:28:47 +00:00
obj = obj
obj . y = 840 - obj . y
if ( obj . text != undefined ) {
2024-03-24 15:41:03 +00:00
mxLog . debug ( obj . text . length )
var v11 = this . graph . insertVertex ( parent , null , obj . text , obj . x , obj . y - 5 ,
2024-03-07 16:28:47 +00:00
obj . text . length * 9 / 2 , 0 ,
"shape=label;fontSize=9;" ) ;
v11 . geometry . relative = false ;
v11 . setConnectable ( false ) ;
if ( obj . owner _record _index != 1 )
chips [ obj . owner _record _index ] . push ( v11 )
}
2024-03-24 15:41:03 +00:00
2024-03-02 01:40:02 +00:00
}
// ctx.textAlign = "left";
// ctx.textBaseline = "bottom";
2022-11-06 03:37:52 +00:00
2024-03-06 15:40:58 +00:00
for ( let obj of doc . objects . filter ( ( o ) => o instanceof AltiumParameter ) ) {
2024-03-02 01:40:02 +00:00
// if (!this.#shouldShow(obj)) continue;
// if (obj.hidden || obj.is_implementation_parameter)
// continue;
// ctx.textAlign = ["left", "left", "right", "right"][obj.orientation];
// ctx.textBaseline = ["bottom", "bottom", "top", "top"][obj.orientation];
// ctx.fillStyle = this.#altiumColourToHex(obj.colour);
// if (obj.orientation == 1)
// {
// ctx.save();
// ctx.translate(obj.x, canvas.height - obj.y);
// ctx.rotate(-Math.PI/2);
// ctx.fillText(obj.text, 0, 0);
// ctx.restore();
// }
// else if (obj.orientation == 3)
// {
// ctx.save();
// ctx.translate(obj.x, canvas.height - obj.y);
// ctx.rotate(Math.PI/2);
// ctx.fillText(obj.text, 0, 0);
// ctx.restore();
// }
// else
// {
// ctx.fillText(obj.text, obj.x, canvas.height - obj.y);
// }
}
// ctx.textAlign = "left";
// ctx.textBaseline = "bottom";
2022-11-06 03:37:52 +00:00
2024-03-06 15:40:58 +00:00
for ( let obj of doc . objects . filter ( ( o ) => o instanceof AltiumNetLabel ) ) {
obj = obj
2024-03-02 01:40:02 +00:00
// if (!this.#shouldShow(obj)) continue;
// if (obj.hidden)
// continue;
// ctx.textAlign = ["left", "center", "right"][obj.justification];
// ctx.textBaseline = ["bottom", "bottom", "top", "top"][obj.orientation];
// ctx.fillStyle = this.#altiumColourToHex(obj.colour);
// if (obj.orientation == 1)
// {
// ctx.save();
// ctx.translate(obj.x, canvas.height - obj.y);
// ctx.rotate(-Math.PI/2);
// ctx.fillText(obj.text, 0, 0);
// ctx.restore();
// }
// else if (obj.orientation == 3)
// {
// ctx.save();
// ctx.translate(obj.x, canvas.height - obj.y);
// ctx.rotate(Math.PI/2);
// ctx.fillText(obj.text, 0, 0);
// ctx.restore();
// }
// else
// {
// ctx.fillText(obj.text, obj.x, canvas.height - obj.y);
// }
}
// ctx.textAlign = "left";
// ctx.textBaseline = "bottom";
2022-11-06 03:37:52 +00:00
2024-03-05 05:44:11 +00:00
2024-03-02 01:40:02 +00:00
// ctx.textAlign = "left";
// ctx.textBaseline = "bottom";
2024-03-06 15:40:58 +00:00
for ( let obj of doc . objects . filter ( ( o ) => o instanceof AltiumPowerPort ) ) {
obj = obj
2024-03-02 01:40:02 +00:00
// if (!this.#shouldShow(obj)) continue;
// if (!obj.show_text)
// continue;
// ctx.fillStyle = this.#altiumColourToHex(obj.colour);
// ctx.textBaseline = ["middle", "top", "middle", "bottom"][obj.orientation];
// ctx.textAlign = ["left", "center", "right", "center"][obj.orientation];
// let offset_x = [12, 0, -12, 0][obj.orientation];
// let offset_y = [0, 20, 0, -20][obj.orientation];
// ctx.fillText(obj.text, obj.x + offset_x, canvas.height - (obj.y + offset_y));
}
2022-11-06 03:37:52 +00:00
2024-03-02 01:40:02 +00:00
// ctx.textAlign = "left";
2024-02-25 16:34:35 +00:00
// ctx.textBaseline = "middle";
2024-03-02 01:40:02 +00:00
// let savedFont = ctx.font;
2024-03-06 15:40:58 +00:00
for ( let obj of doc . objects . filter ( ( o ) => o instanceof AltiumTextFrame ) ) {
2024-03-02 01:40:02 +00:00
// if (!this.#shouldShow(obj)) continue;
// if (obj.font_id > 0 && doc.sheet.fonts[obj.font_id] != null)
// {
// const frameFont = doc.sheet.fonts[obj.font_id];
// const fontStr = (frameFont.size - 1).toString() + "px " + frameFont.name;
// if (fontStr.includes(":") || fontStr.includes("/") || !document.fonts.check(fontStr))
// {
// ctx.font = savedFont;
// }
// else
// {
// ctx.font = fontStr;
// }
// }
// ctx.fillStyle = this.#altiumColourToHex(obj.text_colour);
// ctx.textAlign = ["center", "left", "right"][obj.alignment];
// let offset_x = [(obj.right-obj.left)/2, obj.text_margin, (obj.right-obj.left) - obj.text_margin][obj.alignment];
// if (!obj.word_wrap)
// {
// ctx.fillText(obj.text.replaceAll("~1", "\n"), obj.left + offset_x, canvas.height - (obj.top + (obj.bottom-obj.top)/2));
// }
// else
// {
// // todo: refactor this so that an initial pass figures out all the line splits, then a second pass writes the text, so that vertical alignment can be supported.
// const text = obj.text.replaceAll("~1", "\n");
// const lines = text.split("\n");
// let ypos = 0;
// if (lines.length > 1)
// {
// // this is a total hack, but if there are multiple lines in the text then we can make a rough guess at how far up we need to shift the text to center it vertically
// // this doesn't correct for line wraps (see todo above for refactoring approach) but it's at least something I guess!
// const roughMeasure = ctx.measureText(text);
// ypos = ((roughMeasure.fontBoundingBoxDescent + roughMeasure.fontBoundingBoxAscent) * -lines.length) / 2;
// }
// const maxWidth = (obj.right - obj.left) + (obj.text_margin * 2);
// for (let line of lines)
// {
// const lineMeasure = ctx.measureText(line);
// if (lineMeasure.width <= maxWidth)
// {
// ctx.fillText(line, obj.left + offset_x, (canvas.height - (obj.top + (obj.bottom-obj.top)/2)) + ypos);
// ypos += lineMeasure.fontBoundingBoxDescent + lineMeasure.fontBoundingBoxAscent;
// }
// else
// {
// let words = line.split(" ");
// while (words.length > 0)
// {
// if (words.length == 1)
// {
// // we only have one word, either because that's just how many we had or because the final word is super long
// const lastWord = words[0];
// const lastWordMeasure = ctx.measureText(lastWord);
// ctx.fillText(lastWord, obj.left + offset_x, (canvas.height - (obj.top + (obj.bottom-obj.top)/2)) + ypos);
// ypos += lastWordMeasure.fontBoundingBoxDescent + lineMeasure.fontBoundingBoxAscent;
// words = [];
// break;
// }
// for (let wc = words.length; wc > 0; wc--)
// {
// const partialLine = words.slice(0, wc - 1).join(" ");
// const partialMeasure = ctx.measureText(partialLine);
// if (partialMeasure.width <= maxWidth || wc == 1)
// {
// ctx.fillText(partialLine, obj.left + offset_x, (canvas.height - (obj.top + (obj.bottom-obj.top)/2)) + ypos);
// ypos += partialMeasure.fontBoundingBoxDescent + lineMeasure.fontBoundingBoxAscent;
// words = words.slice(wc - 1);
// break;
// }
// }
// }
// }
// }
// }
}
2022-11-06 03:37:52 +00:00
2024-03-02 01:40:02 +00:00
for ( let obj of doc . objects . filter ( ( o ) => o instanceof AltiumWire ) )
{
let poi = [ ]
for ( let i = 0 ; i < obj . points . length ; i ++ ) {
obj . points [ i ] . y = 840 - obj . points [ i ] . y
if ( ( i != 0 ) && ( i != obj . points . length ) ) {
poi . push ( new mxPoint ( obj . points [ i ] . x , obj . points [ i ] . y ) )
}
}
2024-03-24 15:41:03 +00:00
var e6 = this . graph . insertEdge ( parent , null , '' , null , null , 'fillColor=fff2ff,startArrow=oval' )
2024-03-02 01:40:02 +00:00
e6 . geometry . points = poi
e6 . geometry . setTerminalPoint ( new mxPoint ( obj . points [ 0 ] . x , obj . points [ 0 ] . y ) , true )
e6 . geometry . setTerminalPoint ( new mxPoint ( obj . points [ obj . points . length - 1 ] . x ,
obj . points [ obj . points . length - 1 ] . y ) , false )
2024-03-24 15:41:03 +00:00
if ( this . wires == undefined ) {
this . wires = [ ]
this . wires . push ( e6 )
} else {
this . wires . push ( e6 )
2024-03-02 01:40:02 +00:00
}
2024-03-24 15:41:03 +00:00
2024-03-02 01:40:02 +00:00
// if (!this.#shouldShow(obj)) continue;
// ctx.strokeStyle = this.#altiumColourToHex(obj.colour);
// ctx.lineWidth = obj.width;
// ctx.beginPath();
// ctx.moveTo(obj.points[0].x, obj.points[0].y);
// for (let i = 1; i < obj.points.length; i++)
// {
// ctx.lineTo(obj.points[i].x, obj.points[i].y);
// }
// ctx.stroke();
}
2024-03-24 15:41:03 +00:00
// find the junction on the wire
for ( let obj of doc . objects . filter ( ( o ) => o instanceof AltiumJunction ) )
{
obj . y = 840 - obj . y
let found = false
for ( let i = 0 ; i < this . wires . length ; i ++ ) {
for ( let j = 0 ; j < this . wires [ i ] . geometry . points . length ; j ++ ) {
if ( ( this . wires [ i ] . geometry . points [ j ] . x == obj . x )
&& ( this . wires [ i ] . geometry . points [ j ] . y == obj . y ) ) {
found = true
// this.wires[i].geometry.points.push(new mxPoint(obj.x,obj.y))
// this.wires[i].geometry.points.push(obj.x,obj.y)
}
}
}
// obj = obj
// obj.y = 840 - obj.y
// let edge = this.graph.getCellsBeyond(obj.x,obj.y)
// mxLog.debug(edge)
var v11 = this . graph . insertVertex ( parent , null , '' , obj . x - 1 , obj . y - 1 ,
1 , 1 , '' ) ;
for ( let i in chips ) {
let chip = this . graph . groupCells ( null , 0 , chips [ i ] )
chip . setStyle ( "border=0;strokeColor=none" )
}
2024-03-03 05:14:38 +00:00
}
2022-11-06 03:37:52 +00:00
}
2024-03-02 01:40:02 +00:00
finally {
this . graph . getModel ( ) . endUpdate ( ) ;
2022-11-06 03:37:52 +00:00
}
2024-03-02 01:40:02 +00:00
// ctx.font = savedFont;
// ctx.textAlign = "left";
// ctx.textBaseline = "bottom";
2024-02-25 16:34:35 +00:00
2024-03-02 01:40:02 +00:00
// ctx.setTransform(savedTransform);
// savedFont = ctx.font;
// ctx.textAlign = "left";
// ctx.font = "bold 33px sans-serif";
// ctx.fillStyle = "#000000";
// ctx.globalAlpha = 0.2;
// ctx.save();
// ctx.scale(1,-1);
// ctx.fillText("Preview generated by altium.js", 10, -(canvas.height - 50));
// ctx.font = "bold 15px sans-serif";
// ctx.fillText("for reference purposes only. schematic accuracy not guaranteed.", 12, -(canvas.height - 75));
// ctx.restore();
// ctx.globalAlpha = 1;
// ctx.font = savedFont;
2022-11-06 03:37:52 +00:00
}
}