[MSV8i C#]B样条曲线在2D和3D中,长度取值不同

您好,我在ABD V8i版本中,使用C#创建了BsplineCurveElement曲线,但是在二维图纸中使用.length方法和三维图纸中取到的值不一样,在二维图纸中取到的长度比三维图纸中会小,这个应该怎么解决?谢谢!

Parents
  • 二维的话没有高程信息,确实会比三维下边长度短一些。请确认您创建的曲线在z坐标上是否有变化。

  • z值是有变化的,如果z值发生变化,但是又不得不在2D中去取长度,有什么办法吗?

  • 您好,这个2D元素没有对应的3D元素,它本身是在2维图纸里面创建的,我只是想让他取出的长度值和在3维图纸里面创建时取出的值一样。

  • 您可以创建一个新的元素,2D Model下只能创建2D的元素,即使函数参数有Z坐标值,但是后台都忽略掉了。创建元素时都会传递一个Model,您获取一个3D的model传递过去试试。

  • 您好,请问这个model要怎么设置啊?因为我创建的时候没有model相关的设置!

    public static Bentley.Interop.MicroStationDGN.Application app = Utilities.ComApp;   

    BsplineCurveElement elem = app.CreateBsplineCurveElement1(null, bsp);

  • 我在3维图纸里面创建一个一摸一样b样条曲线,取出来的长度是1100

    如果是一模一样的话,取出来的长度也应该是1000呀。是否你在2D中创建这个B样条曲线时指定了不同的z坐标?在2D中无法体现,到了3D中就体现出来了?最好能提供你创建这个B样条的代码供我们分析。



  •  public static BsplineCurveElement get_luowen_gangjin(double zhijing, double luowen_jiami_jianju, double luowen_feijiami_jianju, double jiami_length, double height, ref double louwen_length)
            {
                double feijiami_length = height - jiami_length;
                int quanshu = 0;
                double real_luowen_jiami_jianju = 0, real_luowen_feijiami_jianju = 0;
    
                quanshu = (int)Math.Round(feijiami_length / luowen_feijiami_jianju);
                if (quanshu > 0)
                {
                    real_luowen_feijiami_jianju = feijiami_length / quanshu;
                }
                else
                {
                    quanshu = 0;
                }
                Point3d[] pts = new Point3d[Convert.ToInt32(quanshu * 72)];
                for (int i = 0; i < pts.Length; i++)
                {
                    Point3d pt = app.Point3dFromXYZ(zhijing / 2.0 * Math.Cos(i * Math.PI / 180 * 5), zhijing / 2.0 * Math.Sin(i * Math.PI / 180 * 5), real_luowen_feijiami_jianju * i / 360.0 * 5);
                    pts[i] = pt;
                }
                List<Point3d> list_pts = new List<Point3d>();
                list_pts.AddRange(pts);
    
                quanshu = (int)Math.Round(jiami_length / luowen_jiami_jianju);
                if (quanshu > 0)
                {
                    real_luowen_jiami_jianju = jiami_length / quanshu;
                }
                else
                {
                    quanshu = 0;
                }
                pts = new Point3d[Convert.ToInt32(quanshu * 72)];
                for (int i = 0; i < pts.Length; i++)
                {
                    Point3d pt = app.Point3dFromXYZ(zhijing / 2.0 * Math.Cos(i * Math.PI / 180 * 5), zhijing / 2.0 * Math.Sin(i * Math.PI / 180 * 5), feijiami_length + real_luowen_jiami_jianju * i / 360.0 * 5);
                    pts[i] = pt;
                }
                list_pts.AddRange(pts);
    
                list_pts.Add(app.Point3dFromXYZ(list_pts[0].X, list_pts[0].Y, list_pts[0].Z + height));
                BsplineCurve bsp = new BsplineCurveClass();
                bsp.SetPoles(list_pts.ToArray());
                BsplineCurveElement elem =  app.CreateBsplineCurveElement1(null, bsp);
                louwen_length = elem.Length;
                //LineElement line = app.CreateLineElement1(null, pts);
                //app.ActiveModelReference.AddElement(elem);
                return elem;
            }

    BsplineCurveElement bselem =PublicClass.get_luowen_gangjin(1000, 200, 200, 10000, 10000, ref length);

    这个是调用的方法,上面的创建的方法,他们是有z值上面的不同,在2维图纸创建后的length和3维图纸创建后的length是不一样的

Reply
  •  public static BsplineCurveElement get_luowen_gangjin(double zhijing, double luowen_jiami_jianju, double luowen_feijiami_jianju, double jiami_length, double height, ref double louwen_length)
            {
                double feijiami_length = height - jiami_length;
                int quanshu = 0;
                double real_luowen_jiami_jianju = 0, real_luowen_feijiami_jianju = 0;
    
                quanshu = (int)Math.Round(feijiami_length / luowen_feijiami_jianju);
                if (quanshu > 0)
                {
                    real_luowen_feijiami_jianju = feijiami_length / quanshu;
                }
                else
                {
                    quanshu = 0;
                }
                Point3d[] pts = new Point3d[Convert.ToInt32(quanshu * 72)];
                for (int i = 0; i < pts.Length; i++)
                {
                    Point3d pt = app.Point3dFromXYZ(zhijing / 2.0 * Math.Cos(i * Math.PI / 180 * 5), zhijing / 2.0 * Math.Sin(i * Math.PI / 180 * 5), real_luowen_feijiami_jianju * i / 360.0 * 5);
                    pts[i] = pt;
                }
                List<Point3d> list_pts = new List<Point3d>();
                list_pts.AddRange(pts);
    
                quanshu = (int)Math.Round(jiami_length / luowen_jiami_jianju);
                if (quanshu > 0)
                {
                    real_luowen_jiami_jianju = jiami_length / quanshu;
                }
                else
                {
                    quanshu = 0;
                }
                pts = new Point3d[Convert.ToInt32(quanshu * 72)];
                for (int i = 0; i < pts.Length; i++)
                {
                    Point3d pt = app.Point3dFromXYZ(zhijing / 2.0 * Math.Cos(i * Math.PI / 180 * 5), zhijing / 2.0 * Math.Sin(i * Math.PI / 180 * 5), feijiami_length + real_luowen_jiami_jianju * i / 360.0 * 5);
                    pts[i] = pt;
                }
                list_pts.AddRange(pts);
    
                list_pts.Add(app.Point3dFromXYZ(list_pts[0].X, list_pts[0].Y, list_pts[0].Z + height));
                BsplineCurve bsp = new BsplineCurveClass();
                bsp.SetPoles(list_pts.ToArray());
                BsplineCurveElement elem =  app.CreateBsplineCurveElement1(null, bsp);
                louwen_length = elem.Length;
                //LineElement line = app.CreateLineElement1(null, pts);
                //app.ActiveModelReference.AddElement(elem);
                return elem;
            }

    BsplineCurveElement bselem =PublicClass.get_luowen_gangjin(1000, 200, 200, 10000, 10000, ref length);

    这个是调用的方法,上面的创建的方法,他们是有z值上面的不同,在2维图纸创建后的length和3维图纸创建后的length是不一样的

Children