您好,我在ABD V8i版本中,使用C#创建了BsplineCurveElement曲线,但是在二维图纸中使用.length方法和三维图纸中取到的值不一样,在二维图纸中取到的长度比三维图纸中会小,这个应该怎么解决?谢谢!
二维的话没有高程信息,确实会比三维下边长度短一些。请确认您创建的曲线在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);
Yang Qi 杨齐 said:我在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是不一样的
前边没注意您是在v8i下,v8i下创建元素时没有指定Model,那您就只能通过MsApp.ActiveDesignFile.Models获取到当前dgn文件的所有Model,然后找到一个是3d的,如果没有就得去创建一个3d的Model(MsApp.ActiveDesignFile.Models.Add)。然后把元素添加到3d Model下去求长度,获取长度之后再恢复即可。
ModelReference model= MyAddin.design_file.Models[MyAddin.model_name]; ModelReference model_test = app.ActiveDesignFile.Models.Add(model, "test", "test", MsdModelType.Default, true); double length = 0; BsplineCurveElement bselem = PublicClass.get_luowen_gangjin(1000, 200, 200, 10000, 10000, ref length); model_test.AddElement(bselem); MessageBox.Show(bselem.AsBsplineCurveElement().Length.ToString());
您好,请问一下我这个代码写的对吗?最上方的model是我记录下来的一个三维的model,和当前的2d model不在同一个dgn文件,model_test是我基于最上面的model创建的一个新model,但是会报错“其他信息: 元素和模型尺寸不同”,请问一下这是什么原因啊?
请问是哪一行出的这个错误?Add新Model时,最好是以当前文件中的Model为TemplateModel或者直接传null。
model_test.AddElement(bselem);是这一行报错,Add新Model已经成功了,但是在AddElement之前要先使用Active这个方法才不会报错,但是使用active的时候会切换model,目前需求是希望不切换model!
因为这个2dmodel所在的图纸只有这一个model,所以第一个参数没法给值,如果我给null时,会报错“无效的TemplateModel”。
我将model_test.AddElement(bselem);改成model_test.CopyElement(bselem);就不会报错了,但是取出来的值还是2D图纸里面的值,相当于创建的是2D元素,拷贝一份到3D图纸里面去了!