先列出创建融合的方法:
/// <summary>
/// 创建融合体
/// </summary>
/// <param name="familyDoc">族文档</param>
/// <param name="sketchPlaneNormal">草图平面法向量</param>
/// <param name="sketchPlaneorigin">草图原点</param>
/// <param name="topProfile">顶部轮廓线</param>
/// <param name="baseProfile">底部轮廓线</param>
/// <returns></returns>
public static Blend CreateBlend(Document familyDoc, XYZ sketchPlaneNormal, XYZ sketchPlaneorigin, CurveArray topProfile, CurveArray baseProfile)
{
Plane geometryPlane = Plane.CreateByNormalAndOrigin(sketchPlaneNormal, sketchPlaneorigin);
if (geometryPlane == null)
{
return null;
}
SketchPlane plane = SketchPlane.Create(familyDoc, geometryPlane);
Blend blend = familyDoc.FamilyCreate.NewBlend(true, topProfile, baseProfile, plane);
return blend;
}
调用如下:
using (Transaction t = new Transaction(doc))
{
t.Start("创建融合体");
var blend = CreateBlend(familyDoc, XYZ.BasisZ, XYZ.Zero, topArry, baseArry);
t.Commit();
}
以上调用代码中的topArry, baseArry分别是顶部和底部的轮廓线。
就这么简单的一个方法,让我堵了两天……
具体情况是这样的:
现在有个功能,要求我根据用户画的一个闭合的模型线框自动生成两层模型并保存成一个族文件然后载入这个族让用户自己布置。
生成的族示例如下:
用户画的模型线很容易取到,但是画出来的形状是不规则的,这样就导致一些问题:
1、模型线坐标是项目文档中的坐标,而我在族文档中需要把坐标以原点为中心转换,否则布置出来的族实例会偏离布置点
2、第一层模型是跟用户画的模型线一样,直接用拉伸生成就行,但是第二层需要让用户自定义底面和顶面,只能用融合生成
小问题就不说了,直接说以上两个问题怎么解决的吧:
1、原点问题,这个问题我是取用户所画模型线中的四个最值坐标,也就是最大X、最小X、最大Y和最小Y,用这四个点组成两条线交叉来获得最接近的中心点,然后用这个中心点在族文件中计算模型与原点的位置的
2、融合问题,因为只有一份闭合的模型线列表,我要根据这个模型线来获取三个平面的轮廓线,分别是第一层拉伸体的轮廓线、第二层融合体底层的轮廓线和顶层的轮廓线。
如果直接用偏移在一个模型线上操作的话,会导致轮廓线的点丢失的问题。
最终我只能把轮廓线克隆了两份,然后再分别生成两份模型线,分别进行偏移。
原本的那份轮廓线作为第一层拉伸体的轮廓线,克隆的两份则分别作为第二层融合体的底层和顶层轮廓线使用。
这里需要注意的是,在创建模型线的时候,融合体顶层的模型线需要设置Z轴,也就是融合体的高度,创建模型线时所用的平面的Z轴也要设置,跟融合体的高度一致,这样最后调用创建融合体的方法的时候才能正常生成。