using BCIMNETGS = Bentley.CIMNET.CIMGeometry.Solid; using BCIMNETT = Bentley.CIMNET.CIMTemplate; using BCIFLG = Bentley.CifNET.LinearGeometry; class CrossSlopeCallbacks : BCIMNETGS::ICrossSlopeCallbacks { /*---------------------------------------------------------------------------------**//** *重载CalcSlopeAlongPath, 提供在任意distance位置上横坡的坡度值。 +---------------+---------------+---------------+---------------+---------------+------*/ public double CalcSlopeAlongPath(double distance) { return 0.2; } }; /*---------------------------------------------------------------------------------**//** *设置模板参数的纵向约束。 *constraintName: 参数化模板中定义的约束变量名称 +---------------+---------------+---------------+---------------+---------------+------*/ private BCIMNETGS.ParametricConstraints GetParametricConstraints(string constraintName1, string constraintName2) { double startDis = 0.0; double endDis1 = 100; double endDis2 = 200; // 设置约束变量constraintName1的纵向变化规则 double startValue1 = 2.7; double endValue1 = 5; // 构造 ConstraintIntervals BCIMNETGS.ConstraintIntervals constraintIntervals1 = new BCIMNETGS.ConstraintIntervals(constraintName1); // 生成变化策略,并将分段纵向参数约束添加约束constraintIntervals对象中 BCIMNETGS.ITransitionStrategy transitionStrategy1 = BCIMNETGS.TransitionStrategyFactory.CreateTransitionStrategy(BCIMNETGS.TransitionStrategyTpye.CircularTransitionStrategy, BCIMNETGS.TransitionDirection.Forward); constraintIntervals1.AddConstraintInterval(startDis, startValue1, endDis1, endValue1, transitionStrategy1); // 添加另一分段约束策略 BCIMNETGS.ITransitionStrategy transitionStrategy2 = BCIMNETGS.TransitionStrategyFactory.CreateTransitionStrategy(BCIMNETGS.TransitionStrategyTpye.CircularTransitionStrategy, BCIMNETGS.TransitionDirection.Reverse); constraintIntervals1.AddConstraintInterval(endDis1, endValue1, endDis2, startValue1, transitionStrategy2); // 设置约束变量constraintName2的纵向变化规则 double startValue2 = 2.7; double endValue2 = 5; // 构造 ConstraintIntervals BCIMNETGS.ConstraintIntervals constraintIntervals2 = new BCIMNETGS.ConstraintIntervals(constraintName2); // 生成变化策略,并将分段纵向参数约束添加约束constraintIntervals对象中 BCIMNETGS.ITransitionStrategy transitionStrategy3 = BCIMNETGS.TransitionStrategyFactory.CreateTransitionStrategy(BCIMNETGS.TransitionStrategyTpye.CircularTransitionStrategy, BCIMNETGS.TransitionDirection.Forward); constraintIntervals2.AddConstraintInterval(startDis, startValue1, endDis2, endValue1, transitionStrategy3); // 构造 ParametricConstraints, Solidcorridor内的参数化纵向约束 BCIMNETGS.ParametricConstraints parametricConstraints = new BCIMNETGS.ParametricConstraints(); parametricConstraints.AddConstraintIntervals(constraintIntervals1); parametricConstraints.AddConstraintIntervals(constraintIntervals2); return parametricConstraints; } /*---------------------------------------------------------------------------------**//** *使用单元模板加参数化变量约束的方法生成solid。 *solidTemplate: 参数化模板 *planLinearElement: 实体生成路径的平曲线 *profileElement: 实体生成路径的纵曲线 *startLimitLine: 实体的起点限制曲线 *endLimitLine: 实体的终点限制曲线 +---------------+---------------+---------------+---------------+---------------+------*/ void Example_CreateSolidWithSolidTemplate(BCIMNETT.Template solidTemplate, BCIFLG.LinearElement planLinearElement, BCIFLG.ProfileElement profileElement, BCIFLG.LinearElement startLimitLine, BCIFLG.LinearElement endLimitLine, DgnModelRef modelRef) { // 构造 SolidCorridor, 可根据参数选择生成的实体横断面垂直于地面或垂直于路径。 BCIMNETGS.SolidCorridor corridor = new BCIMNETGS.SolidCorridor(planLinearElement, profileElement, BCIMNETGS.SectionVerticalRotation.Vertical); // 定义横坡 CrossSlopeCallbacks crossSlopCallback = new CrossSlopeCallbacks(); corridor.SetCrossSlope(crossSlopCallback); // 定义参数化约束 BCIMNETGS.ParametricConstraints parametricConstraints = GetParametricConstraints("Box_Depth"); // 添加SolidCorridorInternal, 确定solid实体段的生成规则 corridor.AddSolidCorridorInterals("Segement_1", solidTemplate, parametricConstraints, modelRef, startLimitLine, endLimitLine, 0.0, 0.0); // 生成实体并获取结果 BCIMNETGS.ISolidCreator solidFromCorridor = new BCIMNETGS.ISolidCreator(corridor, modelRef); solidFromCorridor.CreateSolid(); List<SolidKernelEntity> solidBodies = new List<SolidKernelEntity>(); solidFromCorridor.GetSolidBodies(solidBodies); foreach (SolidKernelEntity solid in solidBodies) { if (solid != null) { Bentley.DgnPlatformNET.Elements.Element ehOut; Bentley.DgnPlatformNET.Convert1.BodyToElement(out ehOut, solid, null, modelRef); ehOut.AddToModel(); } } }