コード例 #1
0
                private static Boolean IsCrossed(PartitionParam setterParam)
                {
                    Partition       dividerTest = setterParam.PartitionPre;
                    PartitionOrigin originTest  = setterParam.OriginPost;

                    Vector3d normal         = originTest.BaseLine.UnitNormal;
                    Polyline trimmed        = setterParam.OutlineLabel.Difference;
                    double   coverAllLength = new BoundingBox(new List <Point3d>(trimmed)).Diagonal.Length * 2;
                    Line     testLine       = new Line(originTest.Point, originTest.Point + normal * coverAllLength);

                    foreach (RoomLine i in dividerTest.Lines)
                    {
                        if (i.UnitTangent == normal)
                        {
                            continue;
                        }

                        Point3d crossPt = CCXTools.GetCrossPt(testLine, i.PureLine);

                        if (PCXTools.IsPtOnLine(crossPt, i.PureLine, 0.005) && PCXTools.IsPtOnLine(crossPt, testLine, 0.005))
                        {
                            return(true);
                        }
                    }

                    return(false);
                }
コード例 #2
0
                private static PartitionParam DrawAtThisBaseEnd(PartitionParam param, double targetArea)
                {
                    PartitionParam thisEndParam = new PartitionParam(param);

                    thisEndParam.OriginPost.Point = param.OriginPost.BaseLine.EndPt;
                    PartitionParam thisEndOutput = DrawOrtho(thisEndParam);

                    if (HasEnoughArea(thisEndOutput, targetArea))
                    {
                        if (thisEndParam.OriginPost.Point == param.OriginPost.Point)
                        {
                            return(thisEndOutput);
                        }

                        return(DrawAtStraight(param, targetArea));
                    }


                    if (IsLastSegment(param))
                    {
                        return(thisEndOutput);
                    }

                    return(DrawAtConvexCorner(param, targetArea));
                }
コード例 #3
0
                private static void SetOriginFromPerpNext(PartitionParam setterParam)
                {
                    Vector3d cornerPre = new Vector3d(setterParam.OriginPost.BasePureLine.UnitTangent);

                    SetOriginNextStart(setterParam);
                    Vector3d cornerPost = setterParam.OriginPost.BasePureLine.UnitTangent;

                    CornerState cornerStat = GetCCWCornerState(cornerPre, cornerPost);

                    if (cornerStat == CornerState.Convex)
                    {
                        return;
                    }

                    int currentIndex = setterParam.OutlineLabel.Core.FindIndex
                                           (i => (i.PureLine == setterParam.OriginPost.BasePureLine));

                    if (currentIndex == setterParam.OutlineLabel.Core.Count - 1)
                    {
                        SetPreEndToOrigin(setterParam);
                        return;
                    }

                    SetNextDivOrigin(setterParam);
                    return;
                }
コード例 #4
0
ファイル: FormMain.cs プロジェクト: radtek/PartitionModel
        /// <summary>
        /// 初始化dbtune管理工作流程
        /// </summary>
        private void InitDbtuneDbtuneManageWorkFlow()
        {
            if (this._workFlow == EnumWorkFlow.TablePartition.ToString())
            {
                InitDbConnect();

                this.txbDbPort.Text = "5151";

                CommonUtil.WriteBlog(this.txbBlog, "---  SDE服务当前未连接");

                this.cmbDbtuneKeyWord.SelectedIndex = -1;
                this.txbDbtuneParamValue.Text       = string.Empty;

                this.cmbDbtuneKeyWord.Properties.Items.Clear();
            }
            this.lciConnTips_2.Visibility = LayoutVisibility.Always;
            this.cmbDbtuneKeyWord.Enabled = false;

            this._dbtuneConfigHelper      = null;
            this._dbtuneConfigParam       = null;
            this._featureClass            = null;
            this.btnImportFeature.Text    = string.Empty;
            this.lciConnTips_1.Visibility = LayoutVisibility.Never;

            this._tbPtitionHelper = null;
            this._partitionParam  = null;

            this.cmbTablespace.SelectedIndex  = -1;
            this.cmbOriginTable.SelectedIndex = -1;
            this.cmbTablespace.Properties.Items.Clear();
            this.cmbOriginTable.Properties.Items.Clear();

            this._workFlow = EnumWorkFlow.DbtuneManage.ToString();
        }
コード例 #5
0
                private static void SetOriginFromEndPt(PartitionParam setterParam)
                {
                    int testIndex = setterParam.OutlineLabel.Core.FindIndex
                                        (i => (i.PureLine == setterParam.OriginPost.BasePureLine));

                    if (testIndex == setterParam.OutlineLabel.Core.Count - 1)
                    {
                        return;
                    }

                    RoomLine formerCornerLine = setterParam.OutlineLabel.Core[testIndex];
                    RoomLine laterCornerLine  = setterParam.OutlineLabel.Core[testIndex + 1];

                    PartitionOrigin laterStart = new PartitionOrigin(laterCornerLine.PureLine.PointAt(0), laterCornerLine);
                    PartitionOrigin laterEnd   = new PartitionOrigin(laterCornerLine.PureLine.PointAt(1), laterCornerLine);

                    CornerState cornerStat = GetCCWCornerState(formerCornerLine.UnitTangent, laterCornerLine.UnitTangent);

                    if (cornerStat == CornerState.Concave)
                    {
                        setterParam.OriginPost = laterEnd;
                        SetNextDivOrigin(setterParam);
                        return;
                    }

                    return;
                }
コード例 #6
0
                private static PartitionParam DrawByBinarySearch(PartitionParam param, double targetArea)
                {
                    double skipTolerance = 0.005;
                    int    iterNum       = 10;

                    Point3d ptEnd   = param.OriginPost.BaseLine.PointAt(1);
                    Point3d ptStart = param.OriginPost.Point;


                    Vector3d searchVector = new Vector3d(ptEnd - ptStart);


                    double searchRange = searchVector.Length;
                    double upperBound  = searchRange;
                    double lowerBound  = 0;

                    if (searchRange < skipTolerance)
                    {
                        return(DrawOrtho(param));
                    }

                    int loopLimiter = 0;

                    while (lowerBound < upperBound)
                    {
                        if (loopLimiter > iterNum)
                        {
                            break;
                        }

                        double  tempStatus   = (upperBound - lowerBound) / 2 + lowerBound;
                        Point3d tempOriginPt = ptStart + searchVector / searchRange * tempStatus;
                        param.OriginPost.Point = tempOriginPt;

                        PartitionParam tempOutput = DrawOrtho(param);
                        double         tempArea   = tempOutput.Outline.GetArea();

                        if (targetArea > tempArea)
                        {
                            lowerBound = tempStatus;
                        }
                        else if (targetArea < tempArea)
                        {
                            upperBound = tempStatus;
                        }
                        else
                        {
                            lowerBound = tempArea;
                            upperBound = tempArea;
                        }

                        loopLimiter++;
                    }

                    Point3d newOriginPt = ptStart + searchVector / searchRange * lowerBound;

                    param.OriginPost.Point = newOriginPt;

                    return(DrawOrtho(param));
                }
コード例 #7
0
 public PartitionParam(PartitionParam otherParam)
 {
     this.PartitionPre  = new Partition(otherParam.PartitionPre);
     this.PartitionPost = new Partition(otherParam.PartitionPost);
     this.OriginPost    = new PartitionOrigin(otherParam.OriginPost);
     this.OutlineLabel  = otherParam.OutlineLabel;
 }
コード例 #8
0
                private static Boolean IsOriginEndConcave(PartitionParam param)
                {
                    int originCurrentIndex = param.OutlineLabel.Core.FindIndex
                                                 (i => (i.PureLine == param.OriginPost.BasePureLine));

                    RoomLine cornerLinePre  = new RoomLine();
                    RoomLine cornerLinePost = new RoomLine();


                    if (originCurrentIndex == param.OutlineLabel.Core.Count - 1)
                    {
                        return(false);
                    }

                    cornerLinePre  = param.OutlineLabel.Core[originCurrentIndex];
                    cornerLinePost = param.OutlineLabel.Core[originCurrentIndex + 1];



                    PartitionSetter.CornerState cornerStat = PartitionSetter.GetCCWCornerState(cornerLinePre.UnitTangent, cornerLinePost.UnitTangent);

                    if (cornerStat == PartitionSetter.CornerState.Concave)
                    {
                        return(true);
                    }

                    return(false);
                }
コード例 #9
0
                public static void SetNextDivOrigin(PartitionParam setterParam)
                {
                    if (!IsCorridorAvailable(setterParam))
                    {
                        int originIndex = setterParam.OutlineLabel.Core.FindIndex
                                              (i => i.PureLine == setterParam.OriginPost.BaseLine.PureLine);

                        if (originIndex != setterParam.OutlineLabel.Core.Count - 1)
                        {
                            FindMinCorridor(setterParam);
                        }
                        else
                        {
                            FindCorrFromSameBaseLast(setterParam);
                        }
                    }

                    //위 코드 분리가능

                    if (setterParam.PartitionPre.Lines.Count > 1)
                    {
                        SetOriginFromFoldedDiv(setterParam);
                        return;
                    }

                    SetOriginFromSingleDiv(setterParam);
                    return;
                }
コード例 #10
0
                //sub method
                /*111공통된 부분 줄일 수 있음.. 일단은 구현*/
                private static void FindMinCorridor(PartitionParam setterParam)
                {
                    RoomLine nearestCorridor = FindNearestCorridor(setterParam.OutlineLabel.Core, setterParam.OriginPost.BaseLine);

                    if (setterParam.OriginPost.BasePureLine == nearestCorridor.PureLine)
                    {
                        FindCorrFromSameBase(setterParam);
                        return;
                    }

                    if (nearestCorridor.Length < RoomDimension.MinLengthForDoor)
                    {
                        SetOriginNextStart(setterParam);
                        FindCorrFromSameBase(setterParam);
                        return;
                    }

                    Point3d nearestBase         = nearestCorridor.StartPt;
                    Point3d baseWithMinCorridor = new Point3d(nearestBase + nearestCorridor.UnitTangent * RoomDimension.MinLengthForDoor);

                    PartitionOrigin originNext = new PartitionOrigin(baseWithMinCorridor, nearestCorridor);

                    setterParam.OriginPost = originNext;
                    return;
                }
コード例 #11
0
                private static PartitionParam DrawAtPreCrossed(PartitionParam preParam)
                {
                    PartitionParam lastParam = new PartitionParam(preParam);

                    lastParam.OriginPost.BaseLine = preParam.OutlineLabel.Core[preParam.OutlineLabel.Core.Count - 2];
                    lastParam.OriginPost.Point    = lastParam.OriginPost.BaseLine.EndPt;

                    return(PartitionMaker.DrawOrtho(lastParam));
                }
コード例 #12
0
                private static void SetOriginFromSameBase(PartitionParam setterParam)
                {
                    if (IsEndPt(setterParam.OriginPost))
                    {
                        SetOriginFromEndPt(setterParam);
                        return;
                    }

                    return;
                }
コード例 #13
0
                private static void SetOriginFromSingleDiv(PartitionParam setterParam)
                {
                    if (setterParam.PartitionPre.Origin.BasePureLine == setterParam.OriginPost.BasePureLine)
                    {
                        SetOriginFromSameBase(setterParam);
                        return;
                    }

                    SetOriginFromOtherBase(setterParam);
                    return;
                }
コード例 #14
0
                //method
                private static PartitionParam DrawAtDoughnutType(PartitionParam preParam, PartitionParam initialParam)
                {
                    PartitionParam lastParam = new PartitionParam(preParam);

                    lastParam.OriginPost.BaseLine  = preParam.OutlineLabel.Core[preParam.OutlineLabel.Core.Count - 1];
                    lastParam.OriginPost.Point     = lastParam.OriginPost.BaseLine.EndPt;
                    lastParam.PartitionPost        = new Partition(initialParam.PartitionPre);
                    lastParam.PartitionPost.Origin = lastParam.OriginPost;

                    return(lastParam);
                }
コード例 #15
0
                private static Boolean HasEnoughArea(PartitionParam paramOutput, double targetArea)
                {
                    double outputArea = PolylineTools.GetArea(paramOutput.Outline);

                    if (outputArea > targetArea)
                    {
                        return(true);
                    }

                    return(false);
                }
コード例 #16
0
                public static PartitionParam DrawOrtho(PartitionParam param)
                {
                    Line            orthoLine = PCXTools.PCXByEquation(param.OriginPost.Point, param.OutlineLabel.Pure, param.OriginPost.BaseLine.UnitNormal);
                    List <RoomLine> orthoList = new List <RoomLine> {
                        new RoomLine(orthoLine, LineType.Inner)
                    };
                    Partition dividerCurrent = new Partition(orthoList, param.OriginPost);

                    PartitionParam paramNext = new PartitionParam(param.PartitionPre, dividerCurrent, dividerCurrent.Origin, param.OutlineLabel);

                    return(paramNext);
                }
コード例 #17
0
                private static PartitionParam DrawAtConvexCorner(PartitionParam param, double targetArea)
                {
                    SetPostStartToOrigin(param);
                    PartitionParam straightOutput = DrawOrtho(param);

                    if (HasEnoughArea(straightOutput, targetArea))
                    {
                        return(TestAtCorner(param, targetArea));
                    }

                    return(DrawEachPartition(param, targetArea));
                }
コード例 #18
0
        /// <summary>
        /// 执行数据表分区工作
        /// </summary>
        /// <param name="txbBlog"></param>
        /// <param name="partitionParam"></param>
        /// <param name="tbpHelper"></param>
        internal static void ExcutePartition(MemoEdit txbBlog, PartitionParam partitionParam, TablePartitionHelper tbpHelper)
        {
            tbpHelper = new TablePartitionHelper(partitionParam);

            if (tbpHelper.PartitionByExchange())
            {
                WriteBlog(txbBlog, "---  执行成功");
            }
            else
            {
                WriteBlog(txbBlog, "---  执行失败,请检查参数");
            }
        }
コード例 #19
0
                private static Boolean IsCloseToStart(PartitionParam paramOutput)
                {
                    Point3d currentDivOrigin = paramOutput.PartitionPost.Origin.Point;
                    Point3d baseLineStart    = paramOutput.PartitionPost.BaseLine.StartPt;

                    double betweenStart = new Vector3d(currentDivOrigin - baseLineStart).Length;

                    if (betweenStart < RoomDimension.MinLengthForDoor * 0.9)
                    {
                        return(true);
                    }

                    return(false);
                }
コード例 #20
0
                /*최소 복도 길이와 본 메서드 톨러런스 둘 다 벗어나는 경우가 있는지..*/
                private static Boolean IsCloseToEnd(PartitionParam paramOutput)
                {
                    Point3d currentDivOrigin = paramOutput.PartitionPost.Origin.Point;
                    Point3d baseLineEnd      = paramOutput.PartitionPost.BaseLine.EndPt;

                    double betweenEnd = new Vector3d(baseLineEnd - currentDivOrigin).Length;

                    if (betweenEnd < RoomDimension.MinLengthForDoor * 0.9)
                    {
                        return(true);
                    }

                    return(false);
                }
コード例 #21
0
                private static Boolean IsLastSegment(PartitionParam param)
                {
                    int originIndex = param.OutlineLabel.Core.FindIndex
                                          (i => i.PureLine == param.OriginPost.BaseLine.PureLine);

                    int lastIndex = param.OutlineLabel.Core.Count - 1;

                    if (originIndex == lastIndex)
                    {
                        return(true);
                    }

                    return(false);
                }
コード例 #22
0
 /// <summary>
 /// 检查分区流程涉及参数
 /// </summary>
 /// <returns></returns>
 internal static bool CheckPartitionParam(MemoEdit txbBlog, PartitionParam partitionParam)
 {
     if (partitionParam.DBHelper == null)
     {
         WriteBlog(txbBlog, "---  数据库连接异常, 请查看错误日志");
         return(false);
     }
     else if (RegexCheck.IsEmpty(partitionParam.TablespaceName))
     {
         WriteBlog(txbBlog, "---  未指定表空间");
         return(false);
     }
     else if (RegexCheck.IsEmpty(partitionParam.OriginTableName))
     {
         WriteBlog(txbBlog, "---  未指定初始表");
         return(false);
     }
     else if (RegexCheck.IsEmpty(partitionParam.BasicField))
     {
         WriteBlog(txbBlog, "---  未指定分区列");
         return(false);
     }
     else if (partitionParam.PartitionWay == EnumPartitionWay.Unknow)
     {
         WriteBlog(txbBlog, "---  未指定分区方式");
         return(false);
     }
     else if (!RegexCheck.IsFull(partitionParam.TablespaceSet))
     {
         WriteBlog(txbBlog, "---  存在没有指定表空间的分区");
         return(false);
     }
     else if (RegexCheck.IsExist(QueryUnityInfo.QueryTotalTable(partitionParam.DBHelper, partitionParam.TablespaceName), partitionParam.PartitionedTableName))
     {
         WriteBlog(txbBlog, "---  名字为 " + partitionParam.PartitionedTableName + "的表已经存在,请更改导出名");
         return(false);
     }
     else
     {
         if (partitionParam.PartitionWay == EnumPartitionWay.Range && partitionParam.PartitionCount == -1)
         {
             WriteBlog(txbBlog, "---未指定范围分区数");
             return(false);
         }
         else
         {
             return(true);
         }
     }
 }
コード例 #23
0
ファイル: FormMain.cs プロジェクト: radtek/PartitionModel
        /// <summary>
        /// 初始化dbtune配置工作流程
        /// </summary>
        private void InitDbtuneConfigWorkFlow()
        {
            if (this._workFlow == EnumWorkFlow.TablePartition.ToString())
            {
                InitDbConnect();

                this.txbDbPort.Text = "5151";

                CommonUtil.WriteBlog(this.txbBlog, "---  SDE服务当前未连接");

                this.btnImportFeature.Text           = string.Empty;
                this.cmbColumnIdentity.SelectedIndex = -1;
                this.cmbPartitionWay.SelectedIndex   = -1;
                this.txbTips.Text             = string.Empty;
                this.btnAssignTablespace.Text = string.Empty;
                this.txbTargetName.Text       = string.Empty;

                this.cmbColumnIdentity.Properties.Items.Clear();
            }


            this.lciConnTips_1.Visibility = LayoutVisibility.Always;
            this._dbtuneConfigParam       = new DbtuneConfigParam();
            this._dbtuneConfigParam.Clear();
            this._featureClass     = null;
            this._partitionCount   = -1;
            this._columnInfoSet    = new Dictionary <string, string>();
            this._boundary         = new Dictionary <string, double>();
            this._partitionInfoSet = new List <PartitionInfo>();
            this._partitionRefer   = new List <string>();

            this.btnImportFeature.Enabled = false;

            this._tbPtitionHelper = null;
            this._partitionParam  = null;

            this.cmbTablespace.SelectedIndex  = -1;
            this.cmbOriginTable.SelectedIndex = -1;
            this.cmbTablespace.Properties.Items.Clear();
            this.cmbOriginTable.Properties.Items.Clear();

            this._dbtuneManageHelper            = null;
            this.cmbDbtuneKeyWord.SelectedIndex = -1;
            this.txbDbtuneParamValue.Text       = string.Empty;
            this.cmbDbtuneKeyWord.Properties.Items.Clear();
            this.lciConnTips_2.Visibility = LayoutVisibility.Never;

            this._workFlow = EnumWorkFlow.DbtuneConfigure.ToString();
        }
コード例 #24
0
                private static Line GetMainLine(PartitionParam param, List <Point3d> outlineVertex)
                {
                    Point3d noFoldOrigin   = param.OriginPost.Point;
                    Line    cornerLinePre  = new Line(noFoldOrigin, outlineVertex.Last());
                    Line    cornerLinePost = new Line(noFoldOrigin, outlineVertex.First());

                    if (cornerLinePre.Length > cornerLinePost.Length)
                    {
                        return(cornerLinePre);
                    }
                    else
                    {
                        return(cornerLinePost);
                    }
                }
コード例 #25
0
                private static PartitionParam DrawAtStraight(PartitionParam param, double targetArea)
                {
                    PartitionParam binaryOutput = DrawByBinarySearch(param, targetArea);

                    if (IsCloseToEnd(binaryOutput))
                    {
                        return(PushOriginToEnd(binaryOutput));
                    }
                    else if (IsCloseToStart(binaryOutput))
                    {
                        return(PushOriginToStart(binaryOutput));
                    }

                    return(binaryOutput);
                }
コード例 #26
0
                //decider method
                private static Boolean IsCorridorAvailable(PartitionParam setterParam)
                {
                    int dividerIndex = setterParam.OutlineLabel.Core.FindIndex
                                           (i => i.PureLine == setterParam.PartitionPre.Origin.BasePureLine);

                    int originIndex = setterParam.OutlineLabel.Core.FindIndex
                                          (i => i.PureLine == setterParam.OriginPost.BasePureLine);

                    if (dividerIndex == originIndex)
                    {
                        return(IsAvailableOnSameBase(setterParam));
                    }

                    return(IsAvailableOnOtherBase(setterParam, dividerIndex, originIndex));
                }
コード例 #27
0
                //sub method
                private static PartitionParam DrawAtConcaveCorner(PartitionParam param, double targetArea)
                {
                    int currentIndex = param.OutlineLabel.Core.FindIndex
                                           (i => (i.PureLine == param.OriginPost.BasePureLine));


                    PartitionParam thisEndParam = new PartitionParam(param);

                    thisEndParam.OriginPost.Point = param.OriginPost.BaseLine.EndPt;
                    PartitionParam thisEndOutput = DrawOrtho(thisEndParam);

                    if (HasEnoughArea(thisEndOutput, targetArea))
                    {
                        PartitionParam tempOutput1 = new PartitionParam(param);
                        PartitionParam tempOutput2 = new PartitionParam(param);
                        SetPostStartToOrigin(tempOutput2);

                        List <PartitionParam> outputCandidate = new List <PartitionParam>();
                        outputCandidate.Add(DrawAtStraight(tempOutput1, targetArea));
                        outputCandidate.Add(DrawEachPartition(tempOutput2, targetArea));

                        return(SelectBetterPartition(outputCandidate, targetArea));
                    }

                    //바로 위와 순서 바꿈.. 문제 되려나?
                    if (param.OriginPost.Point == param.OriginPost.BaseLine.EndPt)
                    {
                        if (currentIndex == param.OutlineLabel.Core.Count - 2)
                        {
                            return(DrawOrtho(param));
                        }

                        SetPostStartToOrigin(param);
                        return(DrawEachPartition(param, targetArea));
                    }

                    //이거 나중에 수정
                    if (currentIndex == param.OutlineLabel.Core.Count - 2)
                    {
                        param.OriginPost.Point = param.OriginPost.BaseLine.EndPt;
                        return(DrawOrtho(param));
                    }


                    //SetPostParallelToOrigin(param);
                    SetPostStartToOrigin(param);
                    return(DrawEachPartition(param, targetArea));
                }
コード例 #28
0
                private static void SetPreEndToOrigin(PartitionParam param)
                {
                    int currentIndex = param.OutlineLabel.Core.FindIndex
                                           (i => (i.PureLine == param.OriginPost.BasePureLine));

                    if (currentIndex == 0)
                    {
                        return;
                    }

                    RoomLine baseLinePre = param.OutlineLabel.Core[currentIndex - 1];

                    param.OriginPost = new PartitionOrigin(baseLinePre.EndPt, baseLinePre);

                    return;
                }
コード例 #29
0
                //setter랑 중복코드 있음!!
                private static void SetPostStartToOrigin(PartitionParam param)
                {
                    int currentIndex = param.OutlineLabel.Core.FindIndex
                                           (i => (i.PureLine == param.OriginPost.BasePureLine));

                    if (currentIndex == param.OutlineLabel.Core.Count - 1)
                    {
                        return;
                    }

                    RoomLine baseLinePost = param.OutlineLabel.Core[currentIndex + 1];

                    param.OriginPost = new PartitionOrigin(baseLinePost.StartPt, baseLinePost);

                    return;
                }
コード例 #30
0
                private static Boolean IsAvailableOnSameBase(PartitionParam setterParam)
                {
                    if (setterParam.OriginPost.Type != LineType.Corridor)
                    {
                        return(false);
                    }

                    double dividerToOrigin = new Vector3d(setterParam.OriginPost.Point - setterParam.PartitionPre.Origin.Point).Length;

                    if (dividerToOrigin < RoomDimension.MinLengthForDoor)
                    {
                        return(false);
                    }

                    return(true);
                }