乐筑天下

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

C#打断曲线方法(程序代码)

[复制链接]

32

主题

651

帖子

8

银币

中流砥柱

Rank: 25

铜币
779
发表于 2006-8-31 22:26:00 | 显示全部楼层 |阅读模式
一直就不喜欢在程序里用命令,在.Net里还有AutoCAD命令与Editor及事务提交之间纠缠不清的关系,特别是三者的次序我实在搞不清楚,托管类里没有打断曲线的方法,AutoCAD的Break命令用起来不顺手,而且还担心不可靠.只好自己写一个打断曲线的方法,各位或许会用得上.花了一个很晚的晚上和一个很早的早上.可以打断直线,圆弧,圆,椭圆,椭圆弧,轻型多义线(封闭和开口的),Xline及射线.
        ///
        /// curveid Object must have existed in Database
        /// Can break Line | Arc | Circle | Ellipse | Polyline | Xline | Ray
        ///
        /// 第一个打断点
        /// 第二个打断点
        /// 要打断曲线的ObjectId
        ///
        public static bool BreakCurve(Point3d p1, Point3d p2, ObjectId curveid)
        {
            //pcm.WriteLine("BreakCurve start", 0);
            try
            {
                Database cdb = curveid.Database;
                using (Transaction ctrans = cdb.TransactionManager.StartTransaction())
                {
                    Curve cur = (Curve)ctrans.GetObject(curveid, OpenMode.ForWrite);
                    Point3d p11 = cur.GetClosestPointTo(p1, false);
                    Point3d p21 = cur.GetClosestPointTo(p2, false);
                    #region Break Line
                    if (cur is Line)
                    {
                        //pcm.WriteLine("Break Line start ", 1);
                        Line l1 = (Line)cur;
                        Line l2 = (Line)l1.Clone();
                        if (l1.GetDistAtPoint(p11)  len12)
                            {
                                if ((double)param32 != param22)
                                {
                                    double bul12 = pl1.GetBulgeAt(param32 - 1);
                                    double bul22 = 0;
                                    if (bul12 != 0.0)
                                    {
                                        double len22 = pl1.GetDistanceAtParameter(param32) - pl1.GetDistanceAtParameter(param32 - 1);
                                        double len32 = pl1.GetDistanceAtParameter(param32) - pl1.GetDistanceAtParameter(param22);
                                        bul22 = Math.Tan(len32 * Math.Atan(bul12) / len22);
                                    }
                                    p31 = pl1.GetPointAtParameter(param22);
                                    pl2.AddVertexAt(0, new Point2d(p31.X, p31.Y), bul22, 0, 0);
                                }
                                for (int i = param32; i  ray1.BasePoint.DistanceTo(p21))
                        {
                            l1 = new Line(ray1.BasePoint, p21);
                            l1.SetPropertiesFrom(ray1);
                            ray1.BasePoint = p11;
                        }
                        else
                        {
                            l1 = new Line(ray1.BasePoint, p11);
                            l1.SetPropertiesFrom(ray1);
                            ray1.BasePoint = p21;
                        }
                        DrawEntity(l1);
                    }
                    #endregion Break Ray
                    ctrans.Commit();
                    return true;
                }
            }
            catch (System.Exception ex)
            { pcm.WriteLine(ex); return false; }
        }
回复

使用道具 举报

3

主题

28

帖子

3

银币

初来乍到

Rank: 1

铜币
40
发表于 2006-9-9 10:02:00 | 显示全部楼层
问:
编译时为何提示无DrawEntity方法?或引用何命名空间?
回复

使用道具 举报

32

主题

651

帖子

8

银币

中流砥柱

Rank: 25

铜币
779
发表于 2006-9-12 14:31:00 | 显示全部楼层
        public static ObjectId DrawEntity(Entity ent)
        { //Debug.WriteLine("Draw Entity");
            try
            {
        Database db=HostApplicationServices.WorkingDatabase;
        Transaction trans = db.TransactionManager.StartTransaction();        
        BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForWrite);
        BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
                btr.AppendEntity(ent);
                trans.AddNewlyCreatedDBObject(ent, true);
                trans.Commit();
  trans.Dispose();
                return ent.ObjectId;
            }
            catch (System.Exception ex)
            {
                // smc.WriteLine(ex);
                return ObjectId.Null;
            }
        }
不好意思,DrawEntity是我定义的一个方法,作用是生成实体.
其实不使用我的方法也行,只要在DrawEntity这个地方把实体提交给数据库就行
回复

使用道具 举报

3

主题

8

帖子

3

银币

初来乍到

Rank: 1

铜币
20
发表于 2007-4-29 16:56:00 | 显示全部楼层
你好,请教一下如何取得多段线中圆弧的中点?回油箱:muli_zxm@163.com
谢谢哦
回复

使用道具 举报

32

主题

651

帖子

8

银币

中流砥柱

Rank: 25

铜币
779
发表于 2007-5-8 13:54:00 | 显示全部楼层
不好意思!好久没有来到这里!前不久才发现有个getSplitCurves函数,打断曲线用这个函数才是正途,
下面是C++的代码,C#里的curve 同样有GetSplitCurves方法,代码应该也差不多
回楼上:可以通过GetBulgeAt(param)的返回值判断是否为圆弧(不等于0就是),然后用GetPointAtParameter(param+0.5)即可得到圆弧中点
bool nsp::breakCurve(AcDbCurve* curve, AcGePoint3d p1, AcGePoint3d p2)
{
  AcGePoint3d p11;
  curve->getClosestPointTo(p1,p11);
  double param1;
  curve->getParamAtPoint(p11,param1);
AcGePoint3d p21;
curve->getClosestPointTo(p2,p21);
  double param2;
  curve->getParamAtPoint(p21,param2);
AcGeDoubleArray params;
if (param1getSplitCurves(params, curveSegments);
  AcDbEntity* ent =NULL;
  if (curveSegments.length()==2)
  {
  ent=(AcDbEntity*)curveSegments[1];
  nsp::drawEntity(ent);
  ent->close();
  }
  else if (curveSegments.length()==3)
  {
  ent=(AcDbEntity*)curveSegments[0];
  nsp::drawEntity(ent);
  ent->close();
  ent=(AcDbEntity*)curveSegments[2];
  nsp::drawEntity(ent);
  ent->close();
  }
curve->erase();
return true ;
}
回复

使用道具 举报

1

主题

4

帖子

1

银币

初来乍到

Rank: 1

铜币
8
发表于 2007-5-11 20:36:00 | 显示全部楼层
这是用什么方式开发的,ActiveX?
回复

使用道具 举报

0

主题

3

帖子

1

银币

初来乍到

Rank: 1

铜币
3
发表于 2008-2-27 13:45:00 | 显示全部楼层
用C#怎样调用Addhatch()函数
回复

使用道具 举报

32

主题

651

帖子

8

银币

中流砥柱

Rank: 25

铜币
779
发表于 2008-3-4 10:23:00 | 显示全部楼层
using app = Autodesk.AutoCAD.ApplicationServices.Application;
AcadApplication CurApp = (AcadApplication)app.AcadApplication;
AcadDocument     CurDoc = CurApp.ActiveDocument;
AcadModelSpace   CurSpace = CurDoc.ModelSpace;
CurSpace.AddHatch(int PatternType, string PatternName, bool Associativity, object HatchObjectType)
AcadBlocks        Blocks = CurDoc.Blocks;
AcadBlock        Block = Blocks.Item(0);
Block .AddHatch(int PatternType, string PatternName, bool Associativity, object HatchObjectType)
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2024-11-22 10:31 , Processed in 0.204553 second(s), 68 queries .

© 2020-2024 乐筑天下

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