明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2330|回复: 11

[求助]关于在CAD中创建两根直线的中线

  [复制链接]
发表于 2012-12-5 15:40:34 | 显示全部楼层 |阅读模式
现在想做一个小的开发,就是创建两条直线的中线。搜索了站内的帖子,没有发现相关内容。
然后自己写了一个以后,在vs2010中没有报错,但是到CAD里面运行后,发生致命错误。
小弟新手上路,望指导。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;

namespace ClassLibrary1
{
    public class Class1
    {
        [CommandMethod("setline")]
        public static void setline()
        {
            Editor acDocEd = Application.DocumentManager.MdiActiveDocument.Editor;
            Document acDoc = Application.DocumentManager.MdiActiveDocument;
            Database acCurDb = acDoc.Database;

            using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
            {

                // 创建一个 TypedValue 数组,用于定义过滤条件
                TypedValue[] acTypValAr = new TypedValue[1];
                acTypValAr.SetValue(new TypedValue((int)DxfCode.Start,"Line"), 0);


                // 赋值过滤条件给 SelectionFilter 对象  
                SelectionFilter acSelFtr = new SelectionFilter(acTypValAr);

                // 要求在图形区域中选择对象  
                PromptSelectionResult acSSPrompt;
                acSSPrompt = acDocEd.GetSelection(acSelFtr);

                // 如果提示状态是 OK,对象就被选择了
                if (acSSPrompt.Status == PromptStatus.OK)
                {
                    SelectionSet acSSet = acSSPrompt.Value;
                    int t = acSSet.Count;
                    int i;
                    Point3dCollection pointstart = new Point3dCollection();
                    Point3dCollection pointend = new Point3dCollection();
                    // 选择集中的对象  
                    for (i = 0; i <= t-1 ; ++i)
                    {
                        if (acSSet != null)
                        {
                            Entity acEnt = acTrans.GetObject(acSSet.ObjectId,
                                                                 OpenMode.ForWrite) as Entity;
                            if (acEnt != null)
                            {
                                Line l = acEnt as Line;
                                pointstart = l.StartPoint;
                                pointend = l.EndPoint;
                            }
                        }
                    }
                    // 以只读方式打开块表
                    BlockTable acBlkTbl;
                    acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,
                                                 OpenMode.ForRead) as BlockTable;

                    // 以写方式打开模型空间块表记录
                    BlockTableRecord acBlkTblRec;
                    acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],
                                                    OpenMode.ForWrite) as BlockTableRecord;


                    Point3d pt1 = pointstart[0] + (pointstart[1] - pointstart[0]) / 2;
                    Point3d pt2 = pointend[0] + (pointend[1] - pointend[0]) / 2;

                    Line acLine = new Line(pt1, pt2);

                    acLine.SetDatabaseDefaults();

                    // 添加新对象到块表记录和事务中
                    acBlkTblRec.AppendEntity(acLine);
                    acTrans.AddNewlyCreatedDBObject(acLine, true);

                    // 保存新对象到数据库中
                    acTrans.Commit();

                }

            }
        }
    }
}




该贴已经同步到 大八脚哈的微博
发表于 2012-12-5 16:52:05 | 显示全部楼层
你好学术[汗][汗][汗]

来自 小八爪嗯 的新浪微博
发表于 2012-12-5 17:27:58 | 显示全部楼层
  Entity acEnt = acTrans.GetObject(acSSet.ObjectId,                                                 OpenMode.ForWrite) as Entity;
-----------------------------------------
看到这里有问题,后面没看
发表于 2012-12-5 17:29:56 | 显示全部楼层
                      if (acSSet != null)
                        {
------------------
这里完全是多余,因为前面有int t = acSSet.Count;
若acSSet ==null则在int t = acSSet.Count;
这句就报异常了
发表于 2012-12-5 17:32:13 | 显示全部楼层
                   pointstart = l.StartPoint;
                                pointend = l.EndPoint;
-----------------------
这两句编译时没报错?
发表于 2012-12-5 20:21:48 | 显示全部楼层
楼上分析全中

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 2012-12-6 11:59:27 | 显示全部楼层
Sage. 发表于 2012-12-5 20:21
楼上分析全中

多谢帮我测试。。。我自己咋嘛没有报错呢- -
 楼主| 发表于 2012-12-6 12:04:58 | 显示全部楼层
sieben 发表于 2012-12-5 17:32
pointstart = l.StartPoint;
                                pointend = l.EndPoint ...

多谢指出错误,也看到了Sage的帮忙测试。我自己弄的时候咋没报错

我想问一下一种形式的表达,就是像point3d的数组一样,可以使用points【2】这种形式来调用其中的第3个点。不知道我表达清楚没,望赐教。
发表于 2012-12-6 14:10:22 | 显示全部楼层
我不知道你所说的"没报错"是指什么,我应该帮不到你了。
发表于 2012-12-7 22:19:30 | 显示全部楼层
看看我的
  1. [CommandMethod("middleline")]
  2. public void MiddleLine()
  3. {
  4.   Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
  5.   
  6.   PromptSelectionOptions selOpts = new PromptSelectionOptions();
  7.   selOpts.MessageForAdding = "选择平行直线段线段";
  8.   SelectionFilter sf = new SelectionFilter(new TypedValue[] {new TypedValue(0,"Line")});
  9.   PromptSelectionResult selRes = ed.GetSelection(selOpts,sf);
  10.   if (selRes.Status != PromptStatus.OK)
  11.   {
  12. //        throw new System.Exception("错误或用户取消");
  13.     return;
  14.   }
  15.   //需要处理的直线段集合
  16.   List<ObjectId> lineObjectIds = new List<ObjectId>(selRes.Value.GetObjectIds());
  17.   using (Transaction trans = HostApplicationServices.WorkingDatabase.TransactionManager.StartTransaction())
  18.   {
  19.     Database db = HostApplicationServices.WorkingDatabase;
  20.     BlockTable bt = trans.GetObject(db.BlockTableId,OpenMode.ForRead) as BlockTable;
  21.     BlockTableRecord btr = trans.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;


  22.     //选取选集第一条线段作为起始线段
  23.     ObjectId fLineId = lineObjectIds[0];
  24.     ObjectId sLineId = lineObjectIds[1];
  25.     Line firstLine = trans.GetObject(fLineId, OpenMode.ForRead) as Line;
  26.     Line secondLine = trans.GetObject(sLineId, OpenMode.ForRead) as Line;
  27.     Line middleLine;
  28.     //判断两条线段的方向做出不同处理
  29.     if (firstLine.Angle == secondLine.Angle)
  30.     {
  31.       middleLine = new Line(MiddlePoint(firstLine.StartPoint,secondLine.StartPoint), MiddlePoint(firstLine.EndPoint,secondLine.EndPoint));
  32.       ed.WriteMessage(firstLine.Angle+"\r\n"+secondLine.Angle);
  33.     }else if ((firstLine.Angle < secondLine.Angle) ? (firstLine.Angle + 180 == secondLine.Angle) : (firstLine.Angle == 180 + secondLine.Angle))
  34.     {
  35.       middleLine = new Line(MiddlePoint(firstLine.StartPoint,secondLine.EndPoint), MiddlePoint(firstLine.EndPoint,secondLine.StartPoint));
  36.       ed.WriteMessage(firstLine.Angle+"\r\n"+secondLine.Angle);
  37.     }else
  38.     {
  39.       MessageBox.Show("所选择线段为非平行线段,请重新选择平行线段!");
  40.       return;
  41.     }
  42.     middleLine.ColorIndex = 210;
  43.     btr.AppendEntity(middleLine);
  44.     trans.AddNewlyCreatedDBObject(middleLine,true);
  45.     trans.Commit();
  46.   }
  47. }
  48. public Point3d MiddlePoint(Point3d p1, Point3d p2)
  49. {
  50.   return new Point3d((p1.X + p2.X)/2.0,(p1.Y + p2.Y)/2.0,(p1.Z + p2.Z)/2.0);
  51. }

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 16:21 , Processed in 0.192843 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表