Snapping links to degrees divisible by 60 could be done using a custom link class:
class IsoLink : DiagramLink
{
private Point AlignPoint(Point point)
{
double a = 0, r = 0;
MindFusion.Geometry2D.Convert.CartesianToPolar(
StartPoint, point, ref a, ref r);
a = ((int)(a - 90) / 60) * 60 + 90;
return MindFusion.Geometry2D.Convert.PolarToCartesian(StartPoint, a, r);
}
protected override void UpdateCreate(Point current)
{
current = AlignPoint(current);
base.UpdateCreate(current);
}
protected override void CompleteCreate(Point end)
{
end = AlignPoint(end);
base.CompleteCreate(end);
}
// todo: UpdateModify
}
You can let users draw such links interactively using a custom behavior class:
class MyBehavior : DrawLinksBehavior
{
public MyBehavior(Diagram diagram) : base(diagram) {}
protected override DiagramLink CreateLink()
{
return new IsoLink();
}
}
diagram.CustomBehavior = new MyBehavior(diagram);
You could also skew the shape of nodes to look as projected isometrically with code like this:
Shape SkewShape(Shape shape)
{
var transform = new SkewTransform(0, 30, 50, 50);
var outline = new ElementTemplate[shape.Outline.Length];
for (int i = 0; i < shape.Outline.Length; i++)
{
var element = shape.Outline[i];
var line = element as LineTemplate;
if (line != null)
{
var pt1 = new Point(line.Coordinates[0], line.Coordinates[1]);
var pt2 = new Point(line.Coordinates[2], line.Coordinates[3]);
pt1 = transform.Transform(pt1);
pt2 = transform.Transform(pt2);
outline[i] = new LineTemplate(pt1.X, pt1.Y, pt2.X, pt2.Y);
}
// todo: bezier, arc, roundrect elements
}
return new Shape(outline, FillRule.Nonzero);
}
shapeNode.Shape = SkewShape(Shapes.Collate);
I hope that helps,
Stoyan