乐筑天下

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

请教高手,在cad图面点击三点,程序自动绘制矩形框程序

[复制链接]

110

主题

324

帖子

10

银币

中流砥柱

Rank: 25

铜币
764
发表于 2019-6-12 16:47:00 | 显示全部楼层 |阅读模式
请教高手,在cad图面点击三点,程序自动绘制矩形框,矩形框可以使倾斜的,哪位大师有.net源代码能否贡献一下学习,谢谢!!!

tkj2rvxktnx.png

tkj2rvxktnx.png

回复

使用道具 举报

14

主题

404

帖子

13

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
455
发表于 2020-3-20 23:28:00 | 显示全部楼层
请参考gile的程序片段:http://www.theswamp.org/index.php?topic=46284.msg513392#msg513392
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;

[assembly: CommandClass(typeof(RectangleDrawJig.CommandMethods))]

namespace RectangleDrawJig
{
    public class CommandMethods
    {
        [CommandMethod("Test", CommandFlags.Modal)]
        public void Test()
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;

            PromptPointResult ppr = ed.GetPoint("\nSpecify the first corner: ");
            if (ppr.Status != PromptStatus.OK) return;
            Matrix3d ucs = ed.CurrentUserCoordinateSystem;
            Point3d basePt = ppr.Value;
            using (Transaction tr = db.TransactionManager.StartTransaction())
            using(Line line = new Line(basePt, basePt))
            using(Polyline pline = new Polyline(4))
            {
                Point2d basePt2d = new Point2d(basePt.X, basePt.Y);
                pline.AddVertexAt(0, basePt2d, 0.0, 0.0, 0.0);
                pline.AddVertexAt(1, basePt2d, 0.0, 0.0, 0.0);
                pline.AddVertexAt(2, basePt2d, 0.0, 0.0, 0.0);
                pline.AddVertexAt(3, basePt2d, 0.0, 0.0, 0.0);
                pline.Closed = true;
                RectangleJig jig = new RectangleJig(pline, line, ucs);
                PromptResult pr = ed.Drag(jig);
                if (pr.Status == PromptStatus.OK)
                {
                    BlockTableRecord btr =
                        (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
                    pline.TransformBy(ucs);
                    btr.AppendEntity(pline);
                    tr.AddNewlyCreatedDBObject(pline, true);
                    line.TransformBy(ucs);
                    btr.AppendEntity(line);
                    tr.AddNewlyCreatedDBObject(line, true);
                }
                tr.Commit();
            }
        }

        class RectangleJig : DrawJig
        {
            private Polyline pline;
            private Line line;
            private Matrix3d ucs2wcs, wcs2ucs;
            private Point3d dragPt;
            private Point2d basePt;

            public RectangleJig(Polyline pline, Line line, Matrix3d ucs)
            {
                this.pline = pline;
                this.line = line;
                this.ucs2wcs = ucs;
                this.wcs2ucs = ucs.Inverse();
                this.dragPt = line.EndPoint;
                this.basePt = pline.GetPoint2dAt(0);
            }

            protected override bool WorldDraw(Autodesk.AutoCAD.GraphicsInterface.WorldDraw draw)
            {
                Autodesk.AutoCAD.GraphicsInterface.WorldGeometry geo = draw.Geometry;
                if (geo != null)
                {
                    geo.PushModelTransform(ucs2wcs);
                    geo.Draw(line);
                    geo.Draw(pline);
                    geo.PopModelTransform();
                }
                return true;
            }

            protected override SamplerStatus Sampler(JigPrompts prompts)
            {
                PromptPointResult ppr = prompts.AcquirePoint("\nSpecify the opposite corner: ");
                if (ppr.Value.IsEqualTo(dragPt))
                    return SamplerStatus.NoChange;
                dragPt = ppr.Value;
                Update();
                return SamplerStatus.OK;
            }

            private void Update()
            {
                Point3d pt = dragPt.TransformBy(wcs2ucs);
                line.EndPoint = pt;
                pline.SetPointAt(1, new Point2d(pt.X, basePt.Y));
                pline.SetPointAt(2, new Point2d(pt.X, pt.Y));
                pline.SetPointAt(3, new Point2d(basePt.X, pt.Y));
            }
        }

    }
}

回复

使用道具 举报

0

主题

26

帖子

10

银币

初来乍到

Rank: 1

铜币
22
发表于 2019-9-5 09:55:00 | 显示全部楼层
关键字,jig,两点距离,向量,坐标转换
回复

使用道具 举报

2

主题

157

帖子

10

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
166
发表于 2019-9-5 10:21:00 | 显示全部楼层
三点是任意三点吗?如果这三点是角点,不一定能构成矩形吧,如果不是角点,那能绘制的矩形不唯一
回复

使用道具 举报

0

主题

26

帖子

10

银币

初来乍到

Rank: 1

铜币
22
发表于 2019-9-7 16:47:00 | 显示全部楼层

点的先后顺序可以确定向量,下面是solidworks的

pzwdc2kkq2r.gif

pzwdc2kkq2r.gif


回复

使用道具 举报

110

主题

324

帖子

10

银币

中流砥柱

Rank: 25

铜币
764
发表于 2019-9-14 18:20:00 | 显示全部楼层
@Leo1980,是这个意思
回复

使用道具 举报

110

主题

324

帖子

10

银币

中流砥柱

Rank: 25

铜币
764
发表于 2020-3-20 17:42:00 | 显示全部楼层
是的
回复

使用道具 举报

9

主题

66

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
102
发表于 2020-3-21 09:37:00 | 显示全部楼层
这个问题也有人回答,真狠惊奇。
回复

使用道具 举报

0

主题

4

帖子

5

银币

初来乍到

Rank: 1

铜币
3
发表于 2021-2-11 20:32:00 | 显示全部楼层
楼主的代码实现了吗
回复

使用道具 举报

1

主题

5

帖子

5

银币

初来乍到

Rank: 1

铜币
10
发表于 2021-7-13 20:52:00 | 显示全部楼层

能发上来,共享一下吗
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2024-11-22 00:07 , Processed in 0.370286 second(s), 75 queries .

© 2020-2024 乐筑天下

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