package force
import (
"fmt"
"github.com/d2lang/elk-go/internal/common/nodespacing"
"github.com/d2lang/elk-go/internal/core"
"github.com/d2lang/elk-go/internal/graph"
)
type Provider struct {}
func Register (registry *core .AlgorithmRegistry ) error {
return registry .Register (core .AlgorithmData {
ID : "org.eclipse.elk.force" ,
Features : core .FeatureMultiEdges | core .FeatureEdgeLabels ,
Create : func () core .LayoutProvider { return &Provider {} },
KnownOptions : []string {
Priority .ID ,
SpacingNodeNode .ID ,
SpacingEdgeLabel .ID ,
AspectRatio .ID ,
RandomSeed .ID ,
SeparateConnectedComponents .ID ,
Padding .ID ,
Interactive .ID ,
core .PortConstraints .ID ,
EdgeLabelsInline .ID ,
OmitNodeMicroLayout .ID ,
"org.eclipse.elk.nodeSize.fixedGraphSize" ,
"org.eclipse.elk.nodeSize.options" ,
core .NodeSizeConstraints .ID ,
"org.eclipse.elk.nodeLabels.placement" ,
"org.eclipse.elk.portLabels.placement" ,
Model .ID ,
Temperature .ID ,
Iterations .ID ,
Repulsion .ID ,
RepulsivePower .ID ,
core .TopdownLayout .ID ,
core .TopdownScaleFactor .ID ,
core .TopdownHierarchicalNodeWidth .ID ,
core .TopdownHierarchicalNodeAspectRatio .ID ,
core .TopdownNodeType .ID ,
},
})
}
func (*Provider ) Layout (model *graph .Model , parent graph .NodeID , monitor core .ProgressMonitor ) error {
if !graph .Get (&model .Node (parent ).Properties , OmitNodeMicroLayout ) {
nodespacing .CalculateLabelAndNodeSizes (model , parent , nil )
}
importer := NewImporter (model , parent )
fgraph , err := importer .ImportGraph ()
if err != nil {
return err
}
components := Split (fgraph )
for _ , component := range components {
var selected forceModel
switch component .Model {
case ModelEades :
selected = &eadesModel {}
case ModelFruchtermanReingold :
selected = &fruchtermanReingoldModel {}
default :
return fmt .Errorf ("unknown force model %q" , component .Model )
}
selected .layout (component , monitor .Subtask (1 /float64 (len (components ))))
}
importer .ApplyLayout (Recombine (components ))
return nil
}
func InitialLayout (model *graph .Model , parent graph .NodeID , monitor core .ProgressMonitor ) error {
return (&Provider {}).Layout (model , parent , monitor )
}
The pages are generated with Golds v0.8.7 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .