找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 4206|回复: 7

比较简单实用的小程序,等分曲线选择集

[复制链接]

已领礼包: 6个

财富等级: 恭喜发财

发表于 2013-4-11 09:58:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
直接上代码了
[C#] 纯文本查看 复制代码
using System;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;

namespace Fsxm.Acad
{
    public class BreakCurve
    {
        //全局变量,默认等分的段数
        static int n = 2;
        static double dist = 5;
        static string Mod = "N";

        //等分曲线选择集
        [CommandMethod("AveragesCurve", CommandFlags.UsePickSet)]
        public void AveragesCurveSs()
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;
            Database db = doc.Database;

            #region 用户输入=================================================
            while (true)
            {
                if (Mod == "D")
                {
                    PromptDistanceOptions op = new PromptDistanceOptions("\n输入定距等分的距离[定数等分(N)]", "N");
                    op.DefaultValue = dist;
                    op.AllowZero = false;

                    PromptDoubleResult drst = ed.GetDistance(op);

                    if (drst.Status == PromptStatus.OK)
                    {
                        Mod = "D";
                        dist = drst.Value;
                        break;
                    }
                    else if (drst.Status == PromptStatus.Keyword)
                        Mod = "N";
                    else if (drst.Status == PromptStatus.Cancel)
                        return;
                    else
                        break;
                }
                else if (Mod == "N")
                {
                    PromptIntegerOptions iop = new PromptIntegerOptions("\n输入定数等分的段数[定距等分(D)]", "D");
                    iop.DefaultValue = n;

                    PromptIntegerResult irst = ed.GetInteger(iop);

                    if (irst.Status == PromptStatus.OK && irst.Value >= 2)
                    {
                        Mod = "N";
                        n = irst.Value;
                        break;
                    }
                    else if (irst.Status == PromptStatus.Keyword)
                        Mod = "D";
                    else if (irst.Status == PromptStatus.Cancel)
                        return;
                    else
                        break;
                }
            }

            PromptSelectionResult srt = ed.GetSelection
                (new SelectionFilter(new TypedValue[] { new TypedValue(0, "arc,circle,ellipse,*line") }));
            SelectionSet ss;
            if (srt.Status == PromptStatus.OK)
                ss = srt.Value;
            else
                return;


            #endregion ======================================================

            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                BlockTableRecord Spase = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);

                if (Mod == "N")
                {
                    foreach (SelectedObject obj in ss)
                    {
                        Curve cv = (Curve)tr.GetObject(obj.ObjectId, OpenMode.ForWrite);

                        foreach (DBObject dbobj in AveragesCurve(cv, n))
                        {
                            Spase.AppendEntity((Entity)dbobj);
                            tr.AddNewlyCreatedDBObject(dbobj, true);
                        }
                    }
                }
                else//定距等分
                {
                    foreach (SelectedObject obj in ss)
                    {
                        Curve cv = (Curve)tr.GetObject(obj.ObjectId, OpenMode.ForWrite);

                        Point3d pt = new Point3d(); bool sel = true;
                        double dist_Ok = dist;
                        if (obj is CrossingOrWindowSelectedObject)
                        {
                            var cobj = (CrossingOrWindowSelectedObject)obj;
                            pt = cobj.GetPickPoints()[0].PointOnLine;
                        }
                        else if (obj is FenceSelectedObject)
                        {
                            var cobj = (FenceSelectedObject)obj;
                            pt = cobj.GetIntersectionPoints()[0].PointOnLine;
                        }
                        else if (obj is PickPointSelectedObject)
                        {
                            var cobj = (PickPointSelectedObject)obj;
                            pt = cobj.PickPoint.PointOnLine;
                        }
                        else
                        {
                            sel = false;
                        }
                        if (sel && cv.StartPoint.DistanceTo(pt) > cv.EndPoint.DistanceTo(pt))
                        {
                            dist_Ok = -dist;
                        }

                        foreach (DBObject dbobj in AveragesCurve(cv, dist_Ok))
                        {
                            Spase.AppendEntity((Entity)dbobj);
                            tr.AddNewlyCreatedDBObject(dbobj, true);
                        }
                    }
                }
                tr.Commit();
            }
        }

        //定数等分单条曲线
        public DBObjectCollection AveragesCurve(Curve cv, int n)
        {
            double ep = cv.EndParam;
            double len = cv.GetDistanceAtParameter(ep);
            double split = len / n;

            DoubleCollection pas = new DoubleCollection();
            if (cv.Closed)                //闭合曲线要先断开
                pas.Add(cv.StartParam);

            for (int i = 1; i < n; i++)
            {
                pas.Add(cv.GetParameterAtDistance(i * split));
            }
            cv.Erase();
            return cv.GetSplitCurves(pas);
        }
        //等距等分单条曲线(dist<0反向等分)
        public DBObjectCollection AveragesCurve(Curve cv, Double dist)
        {
            double ep = cv.EndParam;
            double len = cv.GetDistanceAtParameter(ep);
            double dst = 0;
            //从最后开始等分
            if (dist < 0)
            {
                dist = -dist;
                dst = (cv.GetDistanceAtParameter(cv.EndParam) % dist) - dist;
            }

            DoubleCollection pas = new DoubleCollection();
            if (cv.Closed) pas.Add(cv.StartParam);//闭合曲线要先断开

            while (true)
            {
                dst += dist;
                if (dst >= len) break;
                pas.Add(cv.GetParameterAtDistance(dst));
            }

            cv.Erase();
            return cv.GetSplitCurves(pas);
        }
    }
}

评分

参与人数 1D豆 +2 收起 理由
XDSoft + 2

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 1742个

财富等级: 堆金积玉

发表于 2013-4-11 13:45:35 | 显示全部楼层
{:soso_e179:}学习了,不过这代码挺长的,如果复杂一点的功能那不是.......

点评

嘿嘿,当然要比lisp长N倍哈,但是执行速度秒杀lispN倍  发表于 2013-4-11 22:35
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-7-2 14:31:54 | 显示全部楼层
呵呵,看到高手了,fsxm好
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2020-5-6 16:53:04 | 显示全部楼层
学习,谢谢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 82个

财富等级: 招财进宝

发表于 2020-5-7 14:05:58 | 显示全部楼层
向大佬学习
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2020-10-16 17:24:28 | 显示全部楼层
谢谢,学习一下!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2020-12-29 12:14:56 | 显示全部楼层

回复学习。分享源代码都是英雄
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 57个

财富等级: 招财进宝

发表于 2021-3-11 16:15:50 | 显示全部楼层
谢谢 学习!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-4-20 00:54 , Processed in 0.378455 second(s), 50 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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