乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 134|回复: 9

请问用鼠标点击一条直线如何以鼠标点击坐标将这条线断成2条直线

[复制链接]

16

主题

48

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
112
发表于 2011-4-20 19:34:00 | 显示全部楼层 |阅读模式
请问用鼠标点击一条直线如何以鼠标点击坐标将这条线断成2条直线。其中一条线的起始坐标为原来直线的起始坐标,结束坐标为鼠标点击坐标,另一条线的起始坐标为鼠标点击坐标结束坐标为原来直线的结束坐标。
回复

使用道具 举报

16

主题

48

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
112
发表于 2011-4-21 08:07:00 | 显示全部楼层
第一次搞AutoCAD二次开发,哪为高手教下小弟啊
回复

使用道具 举报

29

主题

503

帖子

8

银币

中流砥柱

Rank: 25

铜币
619
发表于 2011-4-21 11:56:00 | 显示全部楼层
[CommandMethod("t1")]
        public void test1()
        {
            Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
            PromptEntityOptions selectPrompt = new PromptEntityOptions("");            
            PromptEntityResult selectResult = ed.GetEntity(selectPrompt);
            if (selectResult.Status != PromptStatus.OK)
                return;
            Transaction tr=HostApplicationServices.WorkingDatabase.TransactionManager.StartTransaction();
            Line lineObject = tr.GetObject(selectResult.ObjectId, OpenMode.ForWrite) as Line;
            Point3d pt = selectResult.PickedPoint;
            pt = lineObject.GetClosestPointTo(pt, false);
            Point3dCollection breakPoints=new Point3dCollection();
            breakPoints.Add(pt);
            DBObjectCollection resultObjects=lineObject.GetSplitCurves(breakPoints);
            BlockTableRecord btr = tr.GetObject(HostApplicationServices.WorkingDatabase.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
            foreach (DBObject obj in resultObjects)
            {
                btr.AppendEntity((Entity)obj);
                tr.AddNewlyCreatedDBObject(obj, true);
            }
            lineObject.Erase();
            tr.Commit();
            tr.Dispose();
        }
        [CommandMethod("t2")]
        public void test2()
        {
            Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
            PromptPointOptions pointPrompt = new PromptPointOptions("");            
            PromptPointResult pointResult = ed.GetPoint(pointPrompt);
            if (pointResult.Status != PromptStatus.OK)
                return;
            Point3d pt = pointResult.Value;
            PromptSelectionResult lineResult= ed.SelectCrossingWindow(pt, pt);
            if (lineResult.Status != PromptStatus.OK)
                return;
            ObjectId lineId = lineResult.Value.GetObjectIds()[0];
            Transaction tr = HostApplicationServices.WorkingDatabase.TransactionManager.StartTransaction();
            Line lineObject = tr.GetObject(lineId, OpenMode.ForWrite) as Line;
            Point3dCollection breakPoints = new Point3dCollection();
            breakPoints.Add(pt);
            DBObjectCollection resultObjects = lineObject.GetSplitCurves(breakPoints);
            BlockTableRecord btr = tr.GetObject(HostApplicationServices.WorkingDatabase.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
            foreach (DBObject obj in resultObjects)
            {
                btr.AppendEntity((Entity)obj);
                tr.AddNewlyCreatedDBObject(obj, true);
            }
            lineObject.Erase();
            tr.Commit();
            tr.Dispose();
        }
回复

使用道具 举报

16

主题

48

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
112
发表于 2011-4-22 14:41:00 | 显示全部楼层
回复
大哥,你给我的代码怎么用啊,怎么我调试到
Line lineObject = tr.GetObject(selectResult.ObjectId, OpenMode.ForWrite) as Line;
就报错弹出了啊
回复

使用道具 举报

29

主题

503

帖子

8

银币

中流砥柱

Rank: 25

铜币
619
发表于 2011-4-22 16:19:00 | 显示全部楼层
仅支持直线,其余线及优化处理你自己来做。在autocad2011+vs2010上测试通过
回复

使用道具 举报

16

主题

48

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
112
发表于 2011-4-22 16:59:00 | 显示全部楼层
回复
程序中是用Polyline画的线,也是一样用么
回复

使用道具 举报

16

主题

48

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
112
发表于 2011-4-22 17:13:00 | 显示全部楼层
回复
Polyline lineObject = tr.GetObject(selectResult.ObjectId, OpenMode.ForWrite) as Polyline;
还是直接退出了,请问是怎么回事
回复

使用道具 举报

8

主题

138

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
170
发表于 2011-4-22 22:56:00 | 显示全部楼层

算了吧,这个用lisp比.net简单好多哦
(defun c:spL (/ e entt pt1 pnt vent closePnt)
  (vl-load-com)
  (setq omd (getvar "osmode") entt (entsel "\nPlease pick:"))
  (setq e (car entt) vent (vlax-ename->vla-object e) pt1 (cadr entt) closePnt (vlax-curve-getclosestpointto vent pt1))
  (vl-cmdf "Break" entt "F" closepnt closepnt)
  (setvar "osmode" omd)
)
回复

使用道具 举报

8

主题

138

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
170
发表于 2011-4-22 23:02:00 | 显示全部楼层
回复
不过不支持圆和椭圆
回复

使用道具 举报

16

主题

48

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
112
发表于 2011-4-25 07:58:00 | 显示全部楼层
回复
没办法啊,老板就要用.NET
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-15 13:53 , Processed in 5.683317 second(s), 73 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表