public static ICurve CreateBsplineCurve(IReadOnlyCollection<Vector4> controlPoints, IEnumerable knotVectorU, int order, bool isPeriodic, IModeler modeler)
        {
            var controlPointsList = controlPoints
                .SelectMany(p => new double[] {p.X, p.Y, p.Z, p.W}.ToArray())
                .ToArray();

            var dimensionControlPoints = BitConverter.GetBytes(4);
            var orderBytes = BitConverter.GetBytes((int) order);
            var numControlPointsBytes = BitConverter.GetBytes((int) controlPoints.Count);

            var periodicity = BitConverter.GetBytes(isPeriodic ? 1 : 0);

            var props = new[]
            {
                BitConverter.ToDouble(dimensionControlPoints.Concat(orderBytes).ToArray(), 0),
                BitConverter.ToDouble(numControlPointsBytes.Concat(periodicity).ToArray(), 0)
            };

            return (Curve) modeler.CreateBsplineCurve(props, knotVectorU, controlPointsList);
        }
 public OffsetBuilder(ISldWorks app, IModelDoc2 model)
 {
     m_App       = app;
     m_Model     = model;
     m_Modeler   = app.IGetModeler();
     m_MathUtils = m_App.IGetMathUtility();
 }
Пример #3
0
        internal SwTempPrimitive(IMathUtility mathUtils, IModeler modeler, SwTempBody[] bodies, bool isCreated)
        {
            m_MathUtils = mathUtils;
            m_Modeler   = modeler;

            m_Creator = new ElementCreator <ISwTempBody[]>(CreateBodies, bodies, isCreated);
        }
Пример #4
0
        public void Main()
        {
            PartDoc part = swApp.ActiveDoc as PartDoc;

            if (part != null)
            {
                IFace2 face = (part as IModelDoc2).ISelectionManager.GetSelectedObject6(1, -1) as IFace2;

                if (face != null && face.IGetSurface().IsSphere())
                {
                    double[] sphereParams = face.IGetSurface().SphereParams as double[];

                    IModeler modeler = swApp.IGetModeler();

                    ISurface sphereSurf = modeler.CreateSphericalSurface2(
                        new double[] { sphereParams[0], sphereParams[1], sphereParams[2] },
                        new double[] { 0, 0, 1 },
                        new double[] { 1, 0, 0 }, sphereParams[3]) as ISurface;

                    m_PreviewBody = sphereSurf.CreateTrimmedSheet4(new ICurve[] { null }, true) as IBody2;

                    m_PreviewBody.Display3(part, ToColorRef(255, 255, 0), (int)swTempBodySelectOptions_e.swTempBodySelectOptionNone);

                    part.ClearSelectionsNotify += new DPartDocEvents_ClearSelectionsNotifyEventHandler(OnClearSelections);
                }
                else
                {
                    swApp.SendMsgToUser("Please select spherical surface");
                }
            }
            else
            {
                swApp.SendMsgToUser("Please open part document");
            }
        }
Пример #5
0
        internal SwMemorySheetGeometryBuilder(ISwApplication app)
        {
            m_App = app;

            m_MathUtils = m_App.Sw.IGetMathUtility();
            m_Modeler   = m_App.Sw.IGetModeler();
        }
        private static IBody2 CreateSheetFromSurface(IModeler modeler, ISurface surf, double[] uRange, double[] vRange)
        {
            var uvRange = uRange.Concat(vRange).ToArray();
            var sheet   = (IBody2)modeler.CreateSheetFromSurface(surf, uvRange);

            return(sheet);
        }
        public static IBody2 CreateSheetFromSurface(this IModeler modeler, ISurface surf, SurfaceExtensions.PointUv uvLow, SurfaceExtensions.PointUv uvHigh)
        {
            var uRange = new double[] { uvLow.U, uvHigh.U }.OrderBy(v => v).ToArray();
            var vRange = new double[] { uvLow.V, uvHigh.V }.OrderBy(v => v).ToArray();

            return(CreateSheetFromSurface(modeler, surf, uRange, vRange));
        }
Пример #8
0
        protected override object Regenerate(IModeler modeler)
        {
            SwFeatureData.EnableMultiBodyConsume = true;

            if (Database.Style == MulitWireBodiesData.StyleEnum.Wire)
            {
                var w = _R.NextDouble();

                var line0 = modeler.CreateTrimmedLine(new Vector3(0, -w, 0), new Vector3(1, -w, 0));
                var line1 = modeler.CreateTrimmedLine(new Vector3(0, w, 0), new Vector3(1, w, 0));

                var wire0 = line0.CreateWireBody();
                var wire1 = line1.CreateWireBody();

                SwFeatureData.AddIdsToBody(wire0);
                SwFeatureData.AddIdsToBody(wire1);

                return(new[] { wire0, wire1 });
            }
            else
            {
                var solid0 = modeler.CreateBox(new Vector3(0, 0, 0), Vector3.UnitX, 1, 1, 1);
                var solid1 = modeler.CreateBox(new Vector3(2, 0, 0), Vector3.UnitX, 1, 1, 1);

                SwFeatureData.AddIdsToBody(solid0);
                SwFeatureData.AddIdsToBody(solid0);

                return(new[] { solid0, solid1 });
            }
        }
        public static IBody2 CreateSheetFromSurface(this IModeler modeler, ISurface surf, IMathPoint p0, IMathPoint p1)
        {
            var uvLow  = surf.GetClosestPointOnTs(p0.ArrayData.CastArray <double>().ToVector3());
            var uvHigh = surf.GetClosestPointOnTs(p1.ArrayData.CastArray <double>().ToVector3());

            return(modeler.CreateSheetFromSurface(surf, uvLow, uvHigh));
        }
Пример #10
0
        /// <summary>
        /// 将点合成线
        /// </summary>
        /// <param name="modeler"></param>
        /// <param name="points"></param>
        /// <param name="chordTolerance"></param>
        /// <param name="simplify"></param>
        /// <param name="closedCurve"></param>
        /// <returns></returns>
        public static Curve InterpolatePointsToCurve
            (this IModeler modeler
            , List <Vector3> points
            , double chordTolerance
            , bool simplify    = true
            , bool closedCurve = false)
        {
            //points = CurveExtensions.FilterOutShortLines(points, 1e-5).ToList();

            if (closedCurve)
            {
                points.Add(points.First());
            }

            List <ICurve> lines = new List <ICurve>();

            for (int i = 0; i < points.Count - 1; i++)
            {
                modeler.CreateTrimmedLine(points[i].ToSwMathPoint(), points[i + 1].ToSwMathPoint());
            }

            var curve = modeler.MergeCurves(lines);

            if (simplify)
            {
                curve = curve.SimplifyBCurve(chordTolerance);
            }
            return(curve);
        }
        public static Curve InterpolatePointsToCurve
            (this IModeler modeler
            , List <Vector3> points
            , double chordTolerance
            , bool simplify    = true
            , bool closedCurve = false)
        {
            points = CurveExtensions.FilterOutShortLines(points, 1e-5).ToList();

            if (closedCurve)
            {
                points.Add(points.First());
            }

            var lines = points
                        .Buffer(2, 1)
                        .Where(b => b.Count == 2)
                        .Select(ps => modeler.CreateTrimmedLine(ps[0], ps[1]))
                        .Cast <ICurve>()
                        .ToArray();

            var curve = modeler.MergeCurves(lines);

            if (simplify)
            {
                curve = curve.SimplifyBCurve(chordTolerance);
            }
            return(curve);
        }
Пример #12
0
        /// <summary>
        /// 创建直线
        /// </summary>
        /// <param name="modeler">造型接口</param>
        /// <param name="math">数学计算接口</param>
        /// <param name="p0">起点</param>
        /// <param name="v0">方向</param>
        /// <param name="length">长度</param>
        /// <returns></returns>
        public static ICurve CreateTrimmedLine(this IModeler modeler, MathUtility math, Vector3 p0, Vector3 v0, double length)
        {
            v0 = v0.Unit().Scale(length);
            var p1 = p0.Add(v0);

            return(CreateTrimmedLine(modeler, p0.ToSwMathPoint(math), p1.ToSwMathPoint(math)));
        }
        private IBody2[] CreateToolBodies(IModeler modeler, IMathUtility mathUtils, List <object> tools)
        {
            var toolBodies = new List <IBody2>();

            foreach (var tool in tools)
            {
                if (tool is IFeature)
                {
                    var sketch = (tool as IFeature).GetSpecificFeature2() as ISketch;

                    var sketchContours = sketch.GetSketchContours() as object[];

                    if (sketchContours != null)
                    {
                        foreach (ISketchContour skCont in sketchContours)
                        {
                            toolBodies.Add(CreateBodyFromSketchContour(modeler, mathUtils, skCont));
                        }
                    }
                }

                if (tool is ISketchContour)
                {
                    toolBodies.Add(CreateBodyFromSketchContour(modeler, mathUtils, tool as ISketchContour));
                }
            }

            return(toolBodies.ToArray());
        }
Пример #14
0
        /// <summary>
        /// 生成锥体
        /// </summary>
        /// <param name="m">造型接口</param>
        /// <param name="center">中心</param>
        /// <param name="axis">旋转轴</param>
        /// <param name="baseRadius">底部半径</param>
        /// <param name="topRadius">顶部半径</param>
        /// <param name="height">高度</param>
        /// <returns></returns>
        public static IBody2 CreateCone
            (this IModeler m, Vector3 center, Vector3 axis, double baseRadius, double topRadius, double height)
        {
            var array = center.ToDoubles().Concat(axis.ToDoubles()).Concat(new[] { baseRadius, topRadius, height }).ToArray();

            return((IBody2)m.CreateBodyFromCone(array));
        }
Пример #15
0
        /// <summary>
        /// Creates the box solid geometry
        /// </summary>
        /// <param name="modeler">Pointer to modeler</param>
        /// <param name="center">Center coordinate of the box in meters</param>
        /// <param name="dir">Direction of the box</param>
        /// <param name="width">Width of the box in meters</param>
        /// <param name="length">Length of the box in meters</param>
        /// <param name="height">Height of the box in meters. This is a dimension parallel to <paramref name="dir"/></param>
        /// <returns>Pointer to a temp body</returns>
        /// <remarks>Use this method instead of built-in <see href="http://help.solidworks.com/2016/english/api/sldworksapi/SolidWorks.Interop.sldworks~SolidWorks.Interop.sldworks.IModeler~CreateBodyFromBox3.html">IModeler::CreateBodyFromBox</see>
        /// If you need to preserve entity ids as the body generated using the built-in method won't allow to set user id,
        /// which means any reference geometry generated in relation to box entities will become dangling upon rebuild</remarks>
        public static IBody2 CreateBox(this IModeler modeler, Point center, Vector dir,
                                       double width, double length, double height)
        {
            Vector refDir = null;

            return(CreateBox(modeler, center, dir, ref refDir, width, length, height));
        }
        public static ICurve CreateTrimmedLine(this IModeler modeler, Vector3 p0, Vector3 v0, double length)
        {
            v0 = v0.Unit() * (double)length;
            var p1 = p0 + v0;

            return(CreateTrimmedLine(modeler, p0, p1));
        }
Пример #17
0
        /// <summary>
        /// 生成圆柱体
        /// </summary>
        /// <param name="m">造型接口</param>
        /// <param name="radius">半径</param>
        /// <param name="height">高度</param>
        /// <returns></returns>
        public static IBody2 CreateCylinder
            (this IModeler m, double radius, double height)
        {
            var center = Vector3.Zero;
            var axis   = Vector3.UnitZ;

            return(CreateBodyFromCylTs(m, center, axis, radius, height));
        }
Пример #18
0
        internal SwMemorySolidGeometryBuilder(ISwApplication app, IMemoryGeometryBuilderDocumentProvider geomBuilderDocsProvider)
        {
            m_App = app;

            m_MathUtils = m_App.Sw.IGetMathUtility();
            m_Modeler   = m_App.Sw.IGetModeler();

            m_GeomBuilderDocsProvider = geomBuilderDocsProvider;
        }
Пример #19
0
        internal SwTempPrimitive(SwTempBody[] bodies, ISwApplication app, bool isCreated)
        {
            m_App = app;

            m_MathUtils = m_App.Sw.IGetMathUtility();
            m_Modeler   = m_App.Sw.IGetModeler();

            m_Creator = new ElementCreator <ISwTempBody[]>(CreateBodies, bodies, isCreated);
        }
        public RoundStockModel(ISldWorks app, CylindricalStockFitExtractor cylExt, ILogService log)
        {
            m_App     = app;
            m_Modeler = app.IGetModeler();
            m_CylExt  = cylExt;
            m_Log     = log;

            m_Log.LogMessage("Initialized round stock model");
        }
Пример #21
0
        public static ISurface CreatePlanarSurface(this IModeler activeModeler, PointDirection3 plane)
        {
            var planeDirection = plane.Direction;
            var vRef           = planeDirection.Orthogonal();
            var mathVector     = planeDirection;
            var vRootPoint     = plane.Point;

            return((ISurface)activeModeler.CreatePlanarSurface2(vRootPoint.ToDoubles(), mathVector.ToDoubles(), vRef.ToDoubles()));
        }
Пример #22
0
 /// <summary>
 /// 创建长方体
 /// </summary>
 /// <param name="modeler"></param>
 /// <param name="width"></param>
 /// <param name="length"></param>
 /// <param name="height"></param>
 /// <returns></returns>
 public static IBody2 CreateBox(this IModeler modeler,
                                double width,
                                double length,
                                double height) => modeler.CreateBox
     (Vector3.Zero,
     Vector3.UnitZ,
     width,
     length,
     height);
        internal SwMemoryGeometryBuilder(ISwApplication app, IMemoryGeometryBuilderDocumentProvider geomBuilderDocsProvider)
        {
            var mathUtils = app.Sw.IGetMathUtility();

            m_Modeler = app.Sw.IGetModeler();

            WireBuilder  = new SwMemoryWireGeometryBuilder(mathUtils, m_Modeler);
            SheetBuilder = new SwMemorySheetGeometryBuilder(mathUtils, m_Modeler);
            SolidBuilder = new SwMemorySolidGeometryBuilder(app, geomBuilderDocsProvider);
        }
Пример #24
0
        /// <summary>
        /// 指定位置创建圆柱体
        /// </summary>
        /// <param name="modeler">造型接口</param>
        /// <param name="xyz">坐标</param>
        /// <param name="axis">轴心</param>
        /// <param name="radius">半径</param>
        /// <param name="length">长度</param>
        /// <returns></returns>
        public static IBody2 CreateBodyFromCylTs(this IModeler modeler, Vector3 xyz, Vector3 axis, double radius, double length)
        {
            var array = xyz
                        .ToDoubles()
                        .Concat(axis.ToDoubles())
                        .Concat(new[] { radius, length })
                        .ToArray();

            return((IBody2)modeler.CreateBodyFromCyl(array));
        }
Пример #25
0
        private IBody2 CreateBodyFromSketchContour(IModeler modeler,
                                                   IMathUtility mathUtils, ISketchContour skCont, double height, bool midPlane)
        {
            var sketch = skCont.Sketch;

            if (sketch.Is3D())
            {
                throw new UserErrorException("Only 2D sketches are supported");
            }

            var transform = sketch.ModelToSketchTransform.IInverse();

            var boundary = (skCont.GetEdges() as object[])
                           .Cast <IEdge>()
                           .Select(e =>
            {
                var curve = e.IGetCurve().ICopy();    //must copy curve otherwise CreateTrimmedSheet4 is failing
                return(curve);
            }).ToArray();

            var centerPt = mathUtils.CreatePoint(new double[] { 0, 0, 0 }) as IMathPoint;
            var dirVec   = mathUtils.CreateVector(new double[] { 0, 0, 1 }) as IMathVector;
            var refVec   = mathUtils.CreateVector(new double[] { 1, 0, 0 }) as IMathVector;

            centerPt = centerPt.IMultiplyTransform(transform);
            dirVec   = dirVec.IMultiplyTransform(transform);
            refVec   = refVec.IMultiplyTransform(transform);

            if (midPlane)
            {
                var dirRevVec = new Vector(dirVec.ArrayData as double[]);
                dirRevVec.Scale(-1);

                var origPt = new Point(centerPt.ArrayData as double[]);

                MoveCurves(origPt, dirRevVec, height / 2, boundary, mathUtils);
                centerPt = mathUtils.CreatePoint(origPt.Move(dirRevVec, height / 2).ToArray()) as IMathPoint;
            }

            var surf = modeler.CreatePlanarSurface2(centerPt.ArrayData, dirVec.ArrayData, refVec.ArrayData) as ISurface;

            var sheetBody = surf.CreateTrimmedSheet4(boundary, true) as Body2;

            if (sheetBody == null)
            {
                throw new NullReferenceException("Failed to create trimmed sheet from surface region");
            }

            var solidBody = modeler.CreateExtrudedBody(sheetBody, dirVec as MathVector, height) as IBody2;

            var faces = (solidBody.GetFaces() as object[]).Cast <IFace2>().ToArray();

            return(modeler.CreateSheetFromFaces(faces));
        }
Пример #26
0
        public static IBody2 CreateCirclularSheet(this IModeler modeler, Vector3 center, Vector3 vNormal, float radius)
        {
            var surf       = (Surface)modeler.CreatePlanarSurface(center.ToDoubles(), vNormal.ToDoubles());
            var startPoint = center + vNormal.Orthogonal().Unit() * radius;
            var endPoint   = startPoint;
            var arc        =
                (Curve)
                modeler.CreateArc
                    (center.ToDoubles(), vNormal.ToDoubles(), (float)radius, startPoint.ToDoubles(), endPoint.ToDoubles());

            return((IBody2)surf.CreateTrimmedSheet(new[] { arc }));
        }
        public static IBody2[] SplitBodies(IModeler modeler, IBody2 body, SampleMacroFeatureDataBase database)
        {
            var box    = body.GetBodyBoxTs();
            var center = box.Center;
            var axisX  = Vector3.UnitX;

            // Find the point to cut the object
            center.X = (double)(database.Alpha * box.P0.X + (1 - database.Alpha) * box.P1.X);
            var sheet = modeler.CreateSheet(center, axisX, box.MaxDim * 2);

            var cutResult = body.Cut(sheet);

            return(cutResult.Error == 0 ? cutResult.Bodies : null);
        }
        private IBody2[] CropGeometry(IModeler modeler, IMathUtility mathUtils,
                                      List <IBody2> targetBodies, List <object> trimTools)
        {
            if (targetBodies == null || !targetBodies.Any())
            {
                throw new UserErrorException("Select target bodies to trim");
            }

            if (trimTools == null || !trimTools.Any())
            {
                throw new UserErrorException("Select trim tools (sketches or sketch regions)");
            }

            var resBodies = new List <IBody2>();

            var toolBodies = CreateToolBodies(modeler, mathUtils, trimTools);

            if (!toolBodies.Any())
            {
                throw new UserErrorException("No closed regions found in the selected trim tools");
            }

            foreach (var inputBody in targetBodies)
            {
                if (inputBody == null)
                {
                    continue; //TODO: investigate why first body is null
                }

                foreach (var solidBody in toolBodies)
                {
                    var targetBody = inputBody.ICopy();

                    var toolBody = solidBody.ICopy();

                    int      err;
                    object[] res = targetBody.Operations2((int)swBodyOperationType_e.SWBODYINTERSECT, toolBody, out err) as object[];

                    if (res != null)
                    {
                        foreach (IBody2 resBody in res)
                        {
                            resBodies.Add(resBody);
                        }
                    }
                }
            }

            return(resBodies.ToArray());
        }
        public static ICurve CreateTrimmedArc
            (this IModeler modeler, Vector3 center, Vector3 axis, Vector3 startPoint, Vector3 endPoint)
        {
            var radius = (startPoint - center).Length();
            var arc    =
                (Curve)
                modeler.CreateArc
                    (center.ToDoubles(), axis.ToDoubles(), (double)radius, startPoint.ToDoubles(), endPoint.ToDoubles());

            var pp0 = arc.GetClosestPointOn(startPoint.X, startPoint.Y, startPoint.Z).CastArray <double>();
            var pp1 = arc.GetClosestPointOn(endPoint.X, endPoint.Y, endPoint.Z).CastArray <double>();

            return(arc.CreateTrimmedCurve(pp0[3], pp1[3]));
        }
        public static IBody2 CreateSurfaceBody(this IModeler modeler, ISurface surface)
        {
            var swSurfPara = surface.Parameterization2();

            var uvrange = new double[]
            {
                swSurfPara.UMin,
                swSurfPara.UMax,
                swSurfPara.VMin,
                swSurfPara.VMax
            };

            return((IBody2)modeler.CreateSheetFromSurface(surface, uvrange));
        }
Пример #31
0
        /// <summary>
        /// 创建点0 到 点1 的直线
        /// </summary>
        /// <param name="modeler"></param>
        /// <param name="edge"></param>
        /// <returns></returns>
        public static ICurve CreateTrimmedLine(this IModeler modeler, Edge3 edge)
        {
            Debug.Assert(edge.Delta.Length() > double.Epsilon);
            var startPoint = new[] { (double)edge.A.X, (double)edge.A.Y, (double)edge.A.Z };
            var dir        = edge.Delta.Unit();
            var direction  = new[] { (double)dir.X, (double)dir.Y, (double)dir.Z };
            var line       = (ICurve)modeler.CreateLine(startPoint, direction);

            Debug.Assert(line != null, "line != null");
            var pp0 = line.GetClosestPointOn(edge.A.X, edge.A.Y, edge.A.Z) as double[];
            var pp1 = line.GetClosestPointOn(edge.B.X, edge.B.Y, edge.B.Z) as double[];

            line = line.CreateTrimmedCurve2(pp0[0], pp0[1], pp0[2], pp1[0], pp1[1], pp1[2]);
            //var trimmedLine = line.CreateTrimmedCurve(pp0[3], pp1[3]);
            //Debug.Assert(trimmedLine != null, "line != null");
            return(line);
        }
Пример #32
0
   internal static void BuildModelByRow(IModeler   model,
                                        Data       data,
                                        INumVar[]  Buy,
                                        NumVarType type) {
      int nFoods = data.nFoods;
      int nNutrs = data.nNutrs;

      for (int j = 0; j < nFoods; j++) {
         Buy[j] = model.NumVar(data.foodMin[j], data.foodMax[j], type);
      }
      model.AddMinimize(model.ScalProd(data.foodCost, Buy));

      for (int i = 0; i < nNutrs; i++) {
         model.AddRange(data.nutrMin[i],
                        model.ScalProd(data.nutrPerFood[i], Buy),
                        data.nutrMax[i]);
      }
   }
 private static IBody2 CreateSheetFromSurface(IModeler modeler, ISurface surf, double[] uRange, double[] vRange)
 {
     var uvRange = uRange.Concat(vRange).ToArray();
     var sheet = (IBody2) modeler.CreateSheetFromSurface(surf, uvRange);
     return sheet;
 }
Пример #34
0
    // The following method populates the problem with data for the
    // following linear program:
    //
    //    Maximize
    //     x1 + 2 x2 + 3 x3
    //    Subject To
    //     - x1 + x2 + x3 <= 20
    //     x1 - 3 x2 + x3 <= 30
    //    Bounds
    //     0 <= x1 <= 40
    //    End
    //
    // using the IModeler API
    internal static void PopulateByRow(IModeler model,
                             INumVar[][] var,
                             IRange[][] rng)
    {
        double[]    lb      = {0.0, 0.0, 0.0};
          double[]    ub      = {40.0, System.Double.MaxValue, System.Double.MaxValue};
          string[]    varname = {"x1", "x2", "x3"};
          INumVar[] x       = model.NumVarArray(3, lb, ub, varname);
          var[0] = x;

          double[] objvals = {1.0, 2.0, 3.0};
          model.AddMaximize(model.ScalProd(x, objvals));

          rng[0] = new IRange[2];
          rng[0][0] = model.AddLe(model.Sum(model.Prod(-1.0, x[0]),
                                        model.Prod( 1.0, x[1]),
                                        model.Prod( 1.0, x[2])), 20.0, "c1");
          rng[0][1] = model.AddLe(model.Sum(model.Prod( 1.0, x[0]),
                                        model.Prod(-3.0, x[1]),
                                        model.Prod( 1.0, x[2])), 30.0, "c2");
    }
Пример #35
0
    // This method creates the master ILP (arc variables x and degree constraints).
    //
    // Modeling variables:
    // forall (i,j) in A:
    //    x(i,j) = 1, if arc (i,j) is selected
    //           = 0, otherwise
    //
    // Objective:
    // minimize sum((i,j) in A) c(i,j) * x(i,j)
    //
    // Degree constraints:
    // forall i in V: sum((i,j) in delta+(i)) x(i,j) = 1
    // forall i in V: sum((j,i) in delta-(i)) x(j,i) = 1
    //
    // Binary constraints on arc variables:
    // forall (i,j) in A: x(i,j) in {0, 1}
    //
    internal static void CreateMasterILP(IModeler model,
                                        Data data,
                                        IIntVar[][] x)
    {
        int i, j;
          int numNodes = data.numNodes;

          // Create variables x(i,j) for (i,j) in A
          // For simplicity, also dummy variables x(i,i) are created.
          // Those variables are fixed to 0 and do not partecipate to
          // the constraints.

          for (i = 0; i < numNodes; ++i)
          {
         x[i] = new IIntVar[numNodes];
         for (j = 0; j < numNodes; ++j)
         {
            x[i][j] = model.BoolVar("x." + i + "." + j);
            model.Add(x[i][j]);
         }
         x[i][i].UB = 0;
          }

          // Create objective function: minimize sum((i,j) in A ) c(i,j) * x(i,j)

          ILinearNumExpr objExpr = model.LinearNumExpr();
          for (i = 0; i < numNodes; ++i)
         objExpr.Add(model.ScalProd(x[i], data.arcCost[i]));
          model.AddMinimize(objExpr);

          // Add the out degree constraints.
          // forall i in V: sum((i,j) in delta+(i)) x(i,j) = 1

          for (i = 0; i < numNodes; ++i)
          {
         ILinearNumExpr expr = model.LinearNumExpr();
         for (j = 0; j < i; ++j) expr.AddTerm(x[i][j], 1.0);
         for (j = i + 1; j < numNodes; ++j) expr.AddTerm(x[i][j], 1.0);
         model.AddEq(expr, 1.0);
          }

          // Add the in degree constraints.
          // forall i in V: sum((j,i) in delta-(i)) x(j,i) = 1

          for (i = 0; i < numNodes; ++i)
          {
         ILinearNumExpr expr = model.LinearNumExpr();
         for (j = 0; j < i; ++j) expr.AddTerm(x[j][i], 1.0);
         for (j = i + 1; j < numNodes; ++j) expr.AddTerm(x[j][i], 1.0);
         model.AddEq(expr, 1.0);
          }
    }
Пример #36
0
   public static IRange[] MakeCuts(IModeler m, ILPMatrix lp) {
      INumVar x11 = null, x12 = null, x13 = null, x14 = null, x15 = null;
      INumVar x21 = null, x22 = null, x23 = null, x24 = null, x25 = null;
      INumVar x31 = null, x32 = null, x33 = null, x34 = null, x35 = null;
      INumVar x41 = null, x42 = null, x43 = null, x44 = null, x45 = null;
      INumVar x51 = null, x52 = null, x53 = null, x54 = null, x55 = null;
      INumVar w11 = null, w12 = null, w13 = null, w14 = null, w15 = null;
      INumVar w21 = null, w22 = null, w23 = null, w24 = null, w25 = null;
      INumVar w31 = null, w32 = null, w33 = null, w34 = null, w35 = null;
      INumVar w41 = null, w42 = null, w43 = null, w44 = null, w45 = null;
      INumVar w51 = null, w52 = null, w53 = null, w54 = null, w55 = null;

      INumVar[] vars = lp.NumVars;
      int       num  = vars.Length;

      for (int i = 0; i < num; ++i) {
         if      ( vars[i].Name.Equals("X11") ) x11 = vars[i];
         else if ( vars[i].Name.Equals("X12") ) x12 = vars[i];
         else if ( vars[i].Name.Equals("X13") ) x13 = vars[i];
         else if ( vars[i].Name.Equals("X14") ) x14 = vars[i];
         else if ( vars[i].Name.Equals("X15") ) x15 = vars[i];
         else if ( vars[i].Name.Equals("X21") ) x21 = vars[i];
         else if ( vars[i].Name.Equals("X22") ) x22 = vars[i];
         else if ( vars[i].Name.Equals("X23") ) x23 = vars[i];
         else if ( vars[i].Name.Equals("X24") ) x24 = vars[i];
         else if ( vars[i].Name.Equals("X25") ) x25 = vars[i];
         else if ( vars[i].Name.Equals("X31") ) x31 = vars[i];
         else if ( vars[i].Name.Equals("X32") ) x32 = vars[i];
         else if ( vars[i].Name.Equals("X33") ) x33 = vars[i];
         else if ( vars[i].Name.Equals("X34") ) x34 = vars[i];
         else if ( vars[i].Name.Equals("X35") ) x35 = vars[i];
         else if ( vars[i].Name.Equals("X41") ) x41 = vars[i];
         else if ( vars[i].Name.Equals("X42") ) x42 = vars[i];
         else if ( vars[i].Name.Equals("X43") ) x43 = vars[i];
         else if ( vars[i].Name.Equals("X44") ) x44 = vars[i];
         else if ( vars[i].Name.Equals("X45") ) x45 = vars[i];
         else if ( vars[i].Name.Equals("X51") ) x51 = vars[i];
         else if ( vars[i].Name.Equals("X52") ) x52 = vars[i];
         else if ( vars[i].Name.Equals("X53") ) x53 = vars[i];
         else if ( vars[i].Name.Equals("X54") ) x54 = vars[i];
         else if ( vars[i].Name.Equals("X55") ) x55 = vars[i];
         else if ( vars[i].Name.Equals("W11") ) w11 = vars[i];
         else if ( vars[i].Name.Equals("W12") ) w12 = vars[i];
         else if ( vars[i].Name.Equals("W13") ) w13 = vars[i];
         else if ( vars[i].Name.Equals("W14") ) w14 = vars[i];
         else if ( vars[i].Name.Equals("W15") ) w15 = vars[i];
         else if ( vars[i].Name.Equals("W21") ) w21 = vars[i];
         else if ( vars[i].Name.Equals("W22") ) w22 = vars[i];
         else if ( vars[i].Name.Equals("W23") ) w23 = vars[i];
         else if ( vars[i].Name.Equals("W24") ) w24 = vars[i];
         else if ( vars[i].Name.Equals("W25") ) w25 = vars[i];
         else if ( vars[i].Name.Equals("W31") ) w31 = vars[i];
         else if ( vars[i].Name.Equals("W32") ) w32 = vars[i];
         else if ( vars[i].Name.Equals("W33") ) w33 = vars[i];
         else if ( vars[i].Name.Equals("W34") ) w34 = vars[i];
         else if ( vars[i].Name.Equals("W35") ) w35 = vars[i];
         else if ( vars[i].Name.Equals("W41") ) w41 = vars[i];
         else if ( vars[i].Name.Equals("W42") ) w42 = vars[i];
         else if ( vars[i].Name.Equals("W43") ) w43 = vars[i];
         else if ( vars[i].Name.Equals("W44") ) w44 = vars[i];
         else if ( vars[i].Name.Equals("W45") ) w45 = vars[i];
         else if ( vars[i].Name.Equals("W51") ) w51 = vars[i];
         else if ( vars[i].Name.Equals("W52") ) w52 = vars[i];
         else if ( vars[i].Name.Equals("W53") ) w53 = vars[i];
         else if ( vars[i].Name.Equals("W54") ) w54 = vars[i];
         else if ( vars[i].Name.Equals("W55") ) w55 = vars[i];
      }

      IRange[] cut = new IRange[8];

      cut[0] = m.Le(m.Diff(x21, x22), 0.0);
      cut[1] = m.Le(m.Diff(x22, x23), 0.0);
      cut[2] = m.Le(m.Diff(x23, x24), 0.0);
      cut[3] = m.Le(m.Sum(m.Sum(m.Prod(2.08, x11),
                                m.Prod(2.98, x21),
                                m.Prod(3.47, x31),
                                m.Prod(2.24, x41),
                                m.Prod(2.08, x51)),
                          m.Sum(m.Prod(0.25, w11),
                                m.Prod(0.25, w21),
                                m.Prod(0.25, w31),
                                m.Prod(0.25, w41),
                                m.Prod(0.25, w51))), 20.25);
      cut[4] = m.Le(m.Sum(m.Sum(m.Prod(2.08, x12),
                                m.Prod(2.98, x22),
                                m.Prod(3.47, x32),
                                m.Prod(2.24, x42),
                                m.Prod(2.08, x52)),
                          m.Sum(m.Prod(0.25, w12),
                                m.Prod(0.25, w22),
                                m.Prod(0.25, w32),
                                m.Prod(0.25, w42),
                                m.Prod(0.25, w52))), 20.25);
      cut[5] = m.Le(m.Sum(m.Sum(m.Prod(2.08, x13),
                                m.Prod(2.98, x23),
                                m.Prod(3.47, x33),
                                m.Prod(2.24, x43),
                                m.Prod(2.08, x53)),
                          m.Sum(m.Prod(0.25, w13),
                                m.Prod(0.25, w23),
                                m.Prod(0.25, w33),
                                m.Prod(0.25, w43),
                                m.Prod(0.25, w53))), 20.25);
      cut[6] = m.Le(m.Sum(m.Sum(m.Prod(2.08, x14),
                                m.Prod(2.98, x24),
                                m.Prod(3.47, x34),
                                m.Prod(2.24, x44),
                                m.Prod(2.08, x54)),
                          m.Sum(m.Prod(0.25, w14),
                                m.Prod(0.25, w24),
                                m.Prod(0.25, w34),
                                m.Prod(0.25, w44),
                                m.Prod(0.25, w54))), 20.25);
      cut[7] = m.Le(m.Sum(m.Sum(m.Prod(2.08, x15),
                                m.Prod(2.98, x25),
                                m.Prod(3.47, x35),
                                m.Prod(2.24, x45),
                                m.Prod(2.08, x55)),
                          m.Sum(m.Prod(0.25, w15),
                                m.Prod(0.25, w25),
                                m.Prod(0.25, w35),
                                m.Prod(0.25, w45),
                                m.Prod(0.25, w55))), 16.25);

      return cut;
   }