AutoCAD Civil 3D-开发-创建AutoCAD对象01、创建直线

public void CreateLine()
 {
     PromptPointOptions ppo = new PromptPointOptions("\n拾取直线起点:");
     PromptPointResult ppr = ed.GetPoint(ppo);
     if (ppr.Status != PromptStatus.OK) return;
     Point3d startPt = ppr.Value;
     ppo.Message = "\n拾取直线终点: ";
     ppo.UseBasePoint = true;
     ppo.BasePoint = startPt;
     ppr = ed.GetPoint (ppo);
     if (ppr.Status != PromptStatus.OK) return;
     Point3d endPt = ppr.Value;
     Entity line = new Line(startPt, endPt);
     AddEntToModelSpace(line);
 }

01 声明方法CreateLine()
02 {
03     定义ppo变量,“拾取直线起点:”将出现在命令行向用户发出提示
04     从editor获取点
05     判断输入结果,如果结果不ok,退出
06     直线起点
07     修改ppo提示文本,为获取终点做准备
08     设置使用基点属性为真,拾取终点时可从起点拉一根橡皮筋
09     设置基点
10     从editor获取点
11     判断输入结果,如果结果不ok,退出
12     直线终点
13     创建line实体
14     将line实体添加到模型空间
15 }

在这里提出一个问题: Entity line = new Line(startPt, endPt);为什么可以这样写呢?可不可以写成Line line = new Line(startPt, endPt);呢?还有没有其他的方式可以呢?这个问题留给您去思考。

暂时搞不明白也不影响什么,让我接着实现方法AddEntToModelSpace。这个方法在您以后的代码中可能会多次出现。

private void AddEntToModelSpace(Entity ent)
{
     using (Transaction tr = db.TransactionManager.StartTransaction())
     {
             BlockTable bt = db.BlockTableId.GetObject(OpenMode.ForRead) as BlockTable;
             BlockTableRecord btr = bt[BlockTableRecord.ModelSpace]
                  .GetObject(OpenMode.ForWrite) as BlockTableRecord;
             btr.AppendEntity(ent);
             tr.AddNewlyCreatedDBObject(ent, true);
             tr.Commit();
     }
}

01 声明方法,输入参数为entity类型
02 {
03     定义tr变量,开启事务
04     {
05               获取块表,打开方式为只读
06               获取模型空间块表记录,打开方式为写入
07               接上一行
08               将ent添加到块表记录(模型空间)中
09               将新创建的实体添加到事务中
10               事务提交
11     }
12 }

上述代码实现了将实体对象添加至模型空间的操作,这是一个简化版本,有时我们可能需要返回新建对象的ObjectId,或者需要将对象添加到布局(图纸空间)或其他块表记录(图块定义)中,您可以查找相关资料自行完成。

至此,创建一条直线的代码就完成了,接下来让我们完善命令相关的代码。打开另一个类文件myCommands.cs,如果您是用向导创建的项目,一定会有这个文件的。添加或复制修改原有方法,使其与下面的类似:

public class MyCommands
{
    [CommandMethod("MyGroup", "CreateLine","CreateLineLocal",CommandFlags.Modal)]
    public void CreateLine()
    {
            CreateEntityDemo ced = new CreateEntityDemo();
            ced.CreateLine();
    }
}

注意这里的CreateLine方法名称与CreateEntityDemo类中的方法名称是一样的,会不会混淆呢?如果不明白,请翻阅命名空间相关章节,重复加深一下印象。

编译、加载,在命令行中输入命令CreateLine,拾取起点、终点,不出意外的话,成功创建一条直线。接下来可以试着在拾取点的过程中按下Esc键,或者直接用键盘输入点的坐标,看一下是什么效果。

创建直线

对比一下内部命令Line,看有什么区别,怎样才能跟内部命令类似呢?您可以在AutoCAD Managed .NET Developer's Guide 中搜索关键字:keyword,并在其他资源搜索关键字:递归。

转载自:david96007

原地址:https://www.cnblogs.com/myzw/p/7060271.html

展开阅读全文

autocad vba 块创建 插入 分解

01-22

我编写一个程序完成块创建,插入,分解。问题是在我以XYZ等比例插入时可正常分解,可如果以XYZ不同比例插入时,分解完就图形就消失了,不知为什么。而如果程序里不分解,而用手工分解则一切可达预期。rnrnrnOption ExplicitrnDim objacad As AutoCAD.AcadApplicationrnDim objcircle As AutoCAD.AcadCirclernDim objline As AutoCAD.AcadLinernDim objpoint As AutoCAD.AcadPointrnDim objarc As AutoCAD.AcadArcrnrnrnPrivate Sub Command1_Click()rnrnOn Error Resume NextrnSet objacad = GetObject(, "autocad.application")rnIf Err.Number <> 0 Thenrn MsgBox "AutoCAD没有打开"rnExit SubrnEnd Ifrnrnrnobjacad.WindowState = acMaxrnobjacad.ActiveDocument.WindowState = acMaxrnrnDim sset As AcadSelectionSet '定义选择集对象rnDim element As AcadEntity '定义选择集中的元素对象rnobjacad.ActiveDocument.SelectionSets("ss1").DeleternSet sset = objacad.ActiveDocument.PickfirstSelectionSetrnIf sset.Count = 0 ThenrnrnSet sset = objacad.ActiveDocument.SelectionSets.Add("ss1") '新建一个选择集rnrnobjacad.Visible = TruernrnMe.Hidernrnobjacad.Visible = Truernsset.SelectOnScreen '提示用户选择rnElsernMe.Hidernobjacad.Visible = TruernEnd IfrnrnrnDim blockObj As AcadBlockrnDim insertionPnt As Variantrn insertionPnt = objacad.ActiveDocument.Utility.GetPoint(, "请点击块拾取点")rnrnSet blockObj = objacad.ActiveDocument.Blocks.Add(insertionPnt, "CircleBlock")rnrnrnDorn blockObj.Item(blockObj.Count - 1).Deletern rnLoop Until blockObj.Count < 1rnrnrn' 在模型空间选择集中的实体rnDim circleObj As AcadCirclernDim irnDim retObjects() As ObjectrnDim objCollection() As ObjectrnReDim objCollection(0 To sset.Count - 1)rnFor i = 0 To sset.Count - 1rn Set objCollection(i) = sset.Item(i)rn Next irnrnretObjects = objacad.ActiveDocument.CopyObjects(objCollection, blockObj)rn' 插入块到模型空间rnDim blockRefObj As AcadBlockReferencerninsertionPnt = objacad.ActiveDocument.Utility.GetPoint(, "请点击图开放入点")rnSet blockRefObj = objacad.ActiveDocument.ModelSpace.InsertBlock(insertionPnt, "CircleBlock", Text1(0), Text1(1), 1, 0)rnZoomExtentsrnrn ' 分解块参照rnblockRefObj.ExplodernblockRefObj.DeleternrnMe.Showrnsset.deleternEnd Subrn 论坛

没有更多推荐了,返回首页