今天发现AnyCAD.Net SDK发布了,甚是激动,马上同步下代码和SDK使用一下。因为这个东东是这个领域少有的免费的开发包!
按照官方网站上的说法,AnyCAD .Net SDK是给C#的开发者提供的CAD API,而实际上其他.Net的开发者(VB.Net)都可以用。

(图片来自www.anycad.net)
1 下载
在github上可以下载该SDK。解压后大小不到20M,相比其他CAD的SDK来说,确实小!
2 在项目中引用Assembly:

3. 我认为一些有用的类


4. 代码
(摘自官方的示例程序)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using AnyCAD.Platform;
namespace AnyCAD.Basic
{
public partial class FormMain : Form
{
// The global application object
Platform.Application theApplication = new Platform.Application();
// BREP tool to create geometries.
BrepTools shapeMaker = new BrepTools();
// Default 3d View
Platform.View3d theView;
public FormMain()
{
InitializeComponent();
this.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.OnMouseWheel);
}
private void FormMain_Load(object sender, EventArgs e)
{
// Initialize the Application.
theApplication.Initialize();
Size size = panel3d.Size;
// Create the 3d View
theView = theApplication.CreateView(panel3d.Handle.ToInt32(), size.Width, size.Height);
theView.RequestDraw();
this.timerDraw.Enabled = true;
}
private void FormMain_SizeChanged(object sender, EventArgs e)
{
Size size = panel3d.Size;
if(theView != null)
theView.OnSize(size.Width, size.Height);
}
private void panel3d_Paint(object sender, PaintEventArgs e)
{
if (theView == null)
return;
theView.Redraw();
}
private void timerDraw_Tick(object sender, EventArgs e)
{
theView.RequestDraw();
theView.Redraw();
}
private SceneNode ShowTopoShape(TopoShape topoShape, int id)
{
// Add the TopoShape to Scene.
TopoShapeConvert convertor = new TopoShapeConvert();
SceneNode faceNode = convertor.ToFaceNode(topoShape, 0.5f);
faceNode.SetId(id);
theView.GetSceneManager().AddNode(faceNode);
return faceNode;
}
private void ClearScene()
{
theView.GetSceneManager().ClearNodes();
}
private void sphereToolStripMenuItem_Click(object sender, EventArgs e)
{
TopoShape sphere = shapeMaker.MakeSphere(new Vector3(0, 0, 0), 40);
ShowTopoShape(sphere, 100);
}
private void boxToolStripMenuItem_Click(object sender, EventArgs e)
{
TopoShape box = shapeMaker.MakeBox(new Vector3(40, -20, 0), new Vector3(0, 0, 1), new Vector3(30, 40, 60));
SceneNode sceneNode = ShowTopoShape(box, 101);
// Face Style
FaceStyle style = new FaceStyle();
style.SetColor(new ColorValue(0.5f, 0.3f, 0, 1));
sceneNode.SetFaceStyle(style);
}
private void cylinderToolStripMenuItem_Click(object sender, EventArgs e)
{
TopoShape cylinder = shapeMaker.MakeCylinder(new Vector3(80, 0, 0), new Vector3(0, 0, 1), 20, 100, 315);
SceneNode sceneNode = ShowTopoShape(cylinder, 102);
FaceStyle style = new FaceStyle();
style.SetColor(new ColorValue(0.1f, 0.3f, 0.8f, 1));
sceneNode.SetFaceStyle(style);
}
private void coneToolStripMenuItem_Click(object sender, EventArgs e)
{
TopoShape cylinder = shapeMaker.MakeCone(new Vector3(120, 0, 0), new Vector3(0, 0, 1), 20, 100, 40, 315);
ShowTopoShape(cylinder, 103);
}
private void extrudeToolStripMenuItem_Click(object sender, EventArgs e)
{
int size = 20;
// Create the outline edge
TopoShape arc = shapeMaker.MakeArc3Pts(new Vector3(-size, 0, 0), new Vector3(size, 0, 0), new Vector3(0, size, 0));
TopoShape line1 = shapeMaker.MakeLine(new Vector3(-size, -size, 0), new Vector3(-size, 0, 0));
TopoShape line2 = shapeMaker.MakeLine(new Vector3(size, -size, 0), new Vector3(size, 0, 0));
TopoShape line3 = shapeMaker.MakeLine(new Vector3(-size, -size, 0), new Vector3(size, -size, 0));
TopoShapeGroup shapeGroup = new TopoShapeGroup();
shapeGroup.Add(line1);
shapeGroup.Add(arc);
shapeGroup.Add(line2);
shapeGroup.Add(line3);
TopoShape wire = shapeMaker.MakeWire(shapeGroup);
TopoShape face = shapeMaker.MakeFace(wire);
// Extrude
TopoShape extrude = shapeMaker.Extrude(face, 100, new Vector3(0, 0, 1));
ShowTopoShape(extrude, 104);
// Check find....
SceneNode findNode = theView.GetSceneManager().FindNode(104);
theView.GetSceneManager().SelectNode(findNode);
}
private void revoleToolStripMenuItem_Click(object sender, EventArgs e)
{
int size = 10;
// Create the outline edge
TopoShape arc = shapeMaker.MakeArc3Pts(new Vector3(-size, 0, 0), new Vector3(size, 0, 0), new Vector3(0, size, 0));
TopoShape line1 = shapeMaker.MakeLine(new Vector3(-size, -size, 0), new Vector3(-size, 0, 0));
TopoShape line2 = shapeMaker.MakeLine(new Vector3(size, -size, 0), new Vector3(size, 0, 0));
TopoShape line3 = shapeMaker.MakeLine(new Vector3(-size, -size, 0), new Vector3(size, -size, 0));
TopoShapeGroup shapeGroup = new TopoShapeGroup();
shapeGroup.Add(line1);
shapeGroup.Add(arc);
shapeGroup.Add(line2);
shapeGroup.Add(line3);
TopoShape wire = shapeMaker.MakeWire(shapeGroup);
TopoShape revole = shapeMaker.Revol(wire, new Vector3(size * 3, 0, 0), new Vector3(0, 1, 0), 145);
ShowTopoShape(revole, 105);
}
private void clearToolStripMenuItem_Click(object sender, EventArgs e)
{
ClearScene();
}
private void sTLToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFileDialog dlg = new OpenFileDialog();
dlg.Filter = "STL (*.stl)|*.stl|All Files(*.*)|*.*";
if (DialogResult.OK == dlg.ShowDialog())
{
TopoShape shape = shapeMaker.LoadFile(dlg.FileName);
if( shape != null)
ShowTopoShape(shape, 1000);
}
}
private void Pane3d_MouseDown(object sender, MouseEventArgs e)
{
ViewUtility.OnMouseDownEvent(theView, e);
}
private void Pane3d_MouseMove(object sender, MouseEventArgs e)
{
ViewUtility.OnMouseMoveEvent(theView, e);
}
private void Pane3d_MouseUp(object sender, MouseEventArgs e)
{
ViewUtility.OnMouseUpEvent(theView, e);
}
private void OnMouseWheel(object sender, MouseEventArgs e)
{
ViewUtility.OnMouseWheelEvent(theView, e);
}
}
}
5. 运行效果

6. 结论
- 建模功能满足基本的需求
- 支持基本体
- 支持创建拉伸,扫掠,回转体等
- 支持自定义的显示效果设置
- 视图操作符合CAD的操作习惯
- 与AutoCAD相比最大的一个优势就是不是二次开发的方式,直接可以创建独立的应用程序
- 这个东东是免费的