public ROI ConvertToProgROI(GeoDataGridViewModel raw, GeoDataGridViewModel[] dependROIs, int _circleDistanceSetting)
 {
     var model = convertToProgGraphicModel(raw, dependROIs);
     ROI progROI = null;
     switch (model.GeoType)
     {
         case MeasureType.Angle:
             progROI = new ROIProgAngle(model);
             break;
         case MeasureType.Circle:
         case MeasureType.PointCircle:
             progROI = new ROIProgCircle(model) { CircleDistanceSetting = _circleDistanceSetting };
             break;
         case MeasureType.CrossPoint:
             progROI = new ROIProgPoint(model);
             break;
         case MeasureType.Distance:
         case MeasureType.DistanceX:
         case MeasureType.DistanceY:
             progROI = new ROIProgDistance(model);
             break;
         case MeasureType.SymmetryLine:
             progROI = new ROIProgSymmetryLine(model);
             break;
     }
     return progROI;
 }
 private ProgGraphicModel assignValue(GeoDataGridViewModel raw)
 {
     ProgGraphicModel model = null;
     try
     {
         model = new ProgGraphicModel()
             {
                 ID = raw.RecordID,
                 Name = raw.Name,
                 GeoType = raw.GeoType,
                 RowBegin = raw.Row1,
                 RowEnd = raw.Row2,
                 ColBegin = raw.Col1,
                 ColEnd = raw.Col2,
                 StartPhi = (raw.StartPhi),
                 EndPhi = raw.EndPhi,
                 PointerOrder = raw.PointOrder,
                 Distance = raw.Distance,
                 IsExportItem = raw.IsExportItem,
             };
     }
     catch (Exception ex)
     {
         Hanbo.Log.LogManager.Error(ex);
     }
     return model;
 }
 public static IMeasureGeoModel Resolve(GeoDataGridViewModel rawModel)
 {
     MeasureViewModel model = null;
     if (rawModel != null)
     {
         model = new MeasureViewModel()
         {
             Row1 = new HTuple(rawModel.Row1),
             Row2 = new HTuple(rawModel.Row2),
             Col1 = new HTuple(rawModel.Col1),
             Col2 = new HTuple(rawModel.Col2),
             Distance = new HTuple(rawModel.Distance),
             GeoType = rawModel.GeoType
         };
     }
     return model;
 }
Beispiel #4
0
        public static HObject GenContour(ViewModel.GeoDataGridViewModel geoModel)
        {
            HObject displayObject = null;

            switch (geoModel.GeoType)
            {
            case MeasureType.Distance:
            case MeasureType.DistanceX:
            case MeasureType.DistanceY:
                double[] rows = new double[] { geoModel.Row1, geoModel.Row2 };
                double[] cols = new double[] { geoModel.Col1, geoModel.Col2 };
                HOperatorSet.GenContourPolygonXld(out displayObject, rows, cols);
                break;

            case MeasureType.PointCircle:
                HOperatorSet.GenCircle(out displayObject, geoModel.Row1, geoModel.Col1, geoModel.Distance);
                break;

            case MeasureType.CrossPoint:
                HOperatorSet.GenCrossContourXld(out displayObject, geoModel.Row1, geoModel.Col1, 25, 0.785398);
                break;
            }
            return(displayObject);
        }
 public static ResultDisplayViewModel CreateDisplayViewModel(GeoDataGridViewModel model)
 {
     return CreateDisplayViewModel(model, false);
 }
 private TreeNode getGeoTreeNode(GeoDataGridViewModel geoModel)
 {
     var number = _DataList.Count;
     var geoNodeDisplayName = (String.IsNullOrEmpty(geoModel.Name)) ?
                             String.Format(_treeNodeDispNamePattern, number, geoModel.GeoType) : geoModel.Name;
     var geoImageKey = geoModel.GeoType.ToString();
     TreeNode geoNode = new TreeNode()
     {
         Name = geoModel.RecordID,
         Text = geoNodeDisplayName,
         ImageKey = geoImageKey,
         SelectedImageKey = geoImageKey,
         Tag = geoModel.ROIID,
     };
     if (_geoContextMenuStrip != null)
     {
         geoNode.ContextMenuStrip = _geoContextMenuStrip;
     }
     return geoNode;
 }
        private void addTreeNode(ROI activeROI, GeoDataGridViewModel geoModel)
        {
            if (_TreeViewContainer != null)
            {
                var number = _DataList.Count;
                var roiNodeName = String.IsNullOrEmpty(geoModel.Name) ? String.Format("{0} {1}", number.ToString("d2"), activeROI.ROIMeasureType) : geoModel.Name;
                var roiImageKey = activeROI.ROIMeasureType.ToString();
                var index = _TreeViewContainer.Nodes.Count;
                TreeNode roiNode = new TreeNode()
                {
                    Name = geoModel.RecordID,
                    Text = roiNodeName,
                    ImageKey = roiImageKey,
                    SelectedImageKey = roiImageKey,
                    Checked = activeROI.Visiable,
                    Tag = activeROI,
                };
                if (_geoContextMenuStrip != null)
                {
                    roiNode.ContextMenuStrip = _geoContextMenuStrip;
                }

                _TreeViewContainer.Nodes.Add(roiNode);
                _TreeViewContainer.Focus();
                _TreeViewContainer.SelectedNode = roiNode;
            }
        }
 /// <summary>
 /// 新增有 ROI model 的資料列
 /// </summary>
 /// <param name="roi"></param>
 /// <param name="tmpGeoDataViewModel"></param>
 private void addROIRecord(ROI roi, GeoDataGridViewModel tmpGeoDataViewModel)
 {
     _DataList.Add(tmpGeoDataViewModel);
     addTreeNode(roi, tmpGeoDataViewModel);
 }
 /// <summary>
 /// 將 Model 的參考座標清空, 設為 Default
 /// </summary>
 /// <param name="model"></param>
 private void resetModelCoordinate(GeoDataGridViewModel model)
 {
     model.CoordinateID = model.CoordinateName = "";
     model.CoordinateRow = model.Row1;
     model.CoordinateCol = model.Col1;
 }
        private void reAssignModelValue(GeoDataGridViewModel oldModel, GeoDataGridViewModel newModel)
        {
            var lineTypes = new MeasureType[] { MeasureType.Distance,
                                                MeasureType.DistanceX,
                                                MeasureType.DistanceY,
                                                MeasureType.SymmetryLine };

            var isCrossPoint = (oldModel.GeoType == MeasureType.CrossPoint);
            var isCircleType = (oldModel.GeoType == MeasureType.Circle || oldModel.GeoType == MeasureType.PointCircle);
            if (newModel == null)
            {
                modelSetToDefault(oldModel);
            }
            else
            {
                oldModel.Row1 = newModel.Row1;
                oldModel.Col1 = newModel.Col1;
                if (!isCrossPoint)
                {
                    if (lineTypes.Contains(oldModel.GeoType))
                    {
                        oldModel.Row2 = newModel.Row2;
                        oldModel.Col2 = newModel.Col2;
                    }
                    oldModel.Distance = (isCircleType) ? newModel.Distance * _circleDistanceSetting : newModel.Distance;
                    oldModel.WorldDistance = (isCircleType) ? newModel.WorldDistance * _circleDistanceSetting : newModel.WorldDistance;
                }
            }
            if (isCrossPoint)
            {
                updateDependGeoObject(oldModel);
            }
        }
 private GeoDataGridViewModel makeSymmetryLineGeoDataViewModel(GeoDataGridViewModel lineOne, GeoDataGridViewModel lineTwo)
 {
     GeoDataGridViewModel result = null;
     var measure = new MeasurementSymmetryLine(MeasureViewModelResolver.Resolve(lineOne), MeasureViewModelResolver.Resolve(lineTwo), mAssistant);
     var mModel = measure.GetViewModel();
     if (mModel != null)
     {
         var number = _DataList.Count + 1;
         var measureName = number.ToString("d2") + " " + Hanbo.Resources.Resource.Model_SymmetryLine;
         result = new GeoDataGridViewModel()
         {
             Name = measureName,
             Distance = mModel.Distance,
             WorldDistance = pixelToRealWorldValue(mModel.Distance),
             Icon = _ImageList[MeasureType.SymmetryLine.ToString()],
             GeoType = MeasureType.SymmetryLine,
             Row1 = mModel.Row1,
             Col1 = mModel.Col1,
             Row2 = mModel.Row2,
             Col2 = mModel.Col2,
             DependGeoRowNames = new string[] { lineOne.RecordID, lineTwo.RecordID },
             Selected = false,
             Unit = _ExportUnit,
         };
     }
     else
     {
         notifyRecordChanged(GeoDataGridViewNotifyType.ErrorMessage,
                             Hanbo.Resources.Resource.Message_SymmetryLineError);
     }
     return result;
 }
 private GeoDataGridViewModel makeDistanceYGeoDataViewModel(GeoDataGridViewModel pA, GeoDataGridViewModel pB)
 {
     GeoDataGridViewModel result = null;
     var measure = new MeasurementDistanceY(MeasureViewModelResolver.Resolve(pA), MeasureViewModelResolver.Resolve(pB), mAssistant);
     var mModel = measure.GetViewModel();
     if (mModel != null)
     {
         var number = _DataList.Count + 1;
         var measureName = number.ToString("d2") + " " + Hanbo.Resources.Resource.Model_YwayDistance;
         result = new GeoDataGridViewModel()
         {
             Name = measureName,
             Distance = mModel.Distance,
             WorldDistance = pixelToRealWorldValue(mModel.Distance),
             Icon = _ImageList[MeasureType.DistanceY.ToString()],
             GeoType = MeasureType.DistanceY,
             Row1 = mModel.Row1,
             Col1 = mModel.Col1,
             Row2 = mModel.Row2,
             Col2 = mModel.Col2,
             DependGeoRowNames = new string[] { pA.RecordID, pB.RecordID },
             Selected = false,
             Unit = _ExportUnit,
         };
     }
     else
     {
         notifyRecordChanged(GeoDataGridViewNotifyType.ErrorMessage, Hanbo.Resources.Resource.Message_DistanceYWarning);
     }
     return result;
 }
 private GeoDataGridViewModel makeDistanceGeoDataViewModel(GeoDataGridViewModel firstModel, GeoDataGridViewModel secondModel)
 {
     GeoDataGridViewModel result = null;
     if (firstModel != null && secondModel != null)
     {
         var newModel = DistanceHelper.CaculateDistance(MeasureViewModelResolver.Resolve(firstModel), MeasureViewModelResolver.Resolve(secondModel));
         if (newModel != null)
         {
             var number = _DataList.Count + 1;
             var measureName = number.ToString("d2") + " " + Hanbo.Resources.Resource.Model_Distance;
             result = new GeoDataGridViewModel()
             {
                 Name = measureName,
                 Distance = newModel.Distance,
                 WorldDistance = pixelToRealWorldValue(newModel.Distance),
                 Icon = _ImageList[MeasureType.Distance.ToString()],
                 GeoType = MeasureType.Distance,
                 Row1 = newModel.Row1,
                 Col1 = newModel.Col1,
                 Row2 = newModel.Row2,
                 Col2 = newModel.Col2,
                 DependGeoRowNames = new string[] { firstModel.RecordID, secondModel.RecordID },
                 Selected = false,
                 Unit = _ExportUnit,
             };
         }
     }
     else
     {
         notifyRecordChanged(GeoDataGridViewNotifyType.ErrorMessage,
                             Hanbo.Resources.Resource.Message_DependencyNotExists);
     }
     return result;
 }
        private GeoDataGridViewModel makeCrossPointGeoDataViewModel(GeoDataGridViewModel lineOne, GeoDataGridViewModel lineTwo)
        {
            GeoDataGridViewModel result = null;
            var measure = new MeasurementTwoLineCrossPoint(MeasureViewModelResolver.Resolve(lineOne), MeasureViewModelResolver.Resolve(lineTwo), mAssistant);
            var mModel = measure.GetViewModel();
            if (mModel != null)
            {
                var resultData = measure.getMeasureResultData();
                var isParallel = (resultData as PointResult).IsParallel;
                if (isParallel)
                {
                    notifyRecordChanged(GeoDataGridViewNotifyType.ErrorMessage
                        , Hanbo.Resources.Resource.Message_CrossPointWarning);
                }
                else
                {
                    var number = _DataList.Count + 1;
                    var measureName = number.ToString("d2") + " " + Hanbo.Resources.Resource.Model_CrossPoint;
                    var curSkew = _refSkew.SingleOrDefault(p => p.ID == _currentSkewID);
                    result = new GeoDataGridViewModel()
                    {
                        Name = measureName,
                        Icon = _ImageList[MeasureType.CrossPoint.ToString()],
                        GeoType = MeasureType.CrossPoint,
                        Row1 = mModel.Row1,
                        Col1 = mModel.Col1,
                        DependGeoRowNames = new string[] { lineOne.RecordID, lineTwo.RecordID },
                        Selected = false,
                        Unit = "",
                        SkewID = _currentSkewID,
                    };
                    if (curSkew != null)
                    {
                        result.SkewID = _currentSkewID;
                        result.SkewName = curSkew.Name;
                        result.Skew = getSkew(_currentSkewID);
                    }
                }
            }
            else
            {
                notifyRecordChanged(GeoDataGridViewNotifyType.ErrorMessage
                    , "運算模型資料不正確!");

            }
            return result;
        }
        /// <summary>
        /// 3點成圓計算
        /// </summary>
        /// <param name="pA">幾何模型 點 A</param>
        /// <param name="pB">幾何模型 點 B</param>
        /// <param name="pC">幾何模型 點 C</param>
        /// <returns></returns>
        private GeoDataGridViewModel make3PointToCircleGeoDataViewModel(GeoDataGridViewModel pA, GeoDataGridViewModel pB, GeoDataGridViewModel pC)
        {
            GeoDataGridViewModel result = null;
            var pAModel = MeasureViewModelResolver.Resolve(pA);
            var pBModel = MeasureViewModelResolver.Resolve(pB);
            var pcModel = MeasureViewModelResolver.Resolve(pC);

            var isAllPointModel = DistanceHelper.IsPointType(pAModel) && DistanceHelper.IsPointType(pBModel) && DistanceHelper.IsPointType(pcModel);
            if (!isAllPointModel)
            {
                notifyRecordChanged(GeoDataGridViewNotifyType.ErrorMessage
                    , Hanbo.Resources.Resource.Message_DependencyNotExists);
                return result;
            }
            MeasureViewModel newModel = DistanceHelper.Get3PointToCircleModel(pAModel, pBModel, pcModel);
            if (newModel != null)
            {
                var number = _DataList.Count + 1;
                var measureName = number.ToString("d2") + " " + Hanbo.Resources.Resource.Model_3PointCircle;
                result = new GeoDataGridViewModel()
                {
                    Name = measureName,
                    Distance = newModel.Distance,
                    WorldDistance = pixelToRealWorldValue(newModel.Distance),
                    Icon = _ImageList[MeasureType.PointCircle.ToString()],
                    GeoType = MeasureType.PointCircle,
                    Row1 = newModel.Row1,
                    Col1 = newModel.Col1,
                    DependGeoRowNames = new string[] { pA.RecordID, pB.RecordID, pC.RecordID },
                    Selected = false,
                    Unit = _ExportUnit,
                };
            }
            else
            {
                notifyRecordChanged(GeoDataGridViewNotifyType.ErrorMessage,
                    Hanbo.Resources.Resource.Message_3PointCircleWarning);
            }
            return result;
        }
 /// <summary>
 /// 新增量測記錄 (distance, symmetrylin, angle, 3pointCircle)
 /// </summary>
 /// <param name="model"></param>
 private void addMeasuredViewModel(GeoDataGridViewModel model)
 {
     if (model.GeoType == MeasureType.PointCircle || model.GeoType == MeasureType.Circle)
     {
         model.Distance = model.Distance * _circleDistanceSetting;
         model.WorldDistance = model.WorldDistance * _circleDistanceSetting;
     }
     _DataList.Add(model);
     addMeasuredTreeNode(model);
 }
 private void resetModelSkew(GeoDataGridViewModel refModel)
 {
     refModel.Skew = 0;
     refModel.SkewID = "";
     refModel.SkewName = "";
 }
        /// <summary>
        /// 以ROI 元素為主的呈現結構 (量測元素會加入在 ROI 元素下)
        /// </summary>
        /// <param name="geoModel"></param>
        private void addSubNodeBaseOnROIMeasureElement(GeoDataGridViewModel geoModel)
        {
            ///* //
            //目前 Focus 的節點
            var selectedNode = _TreeViewContainer.SelectedNode;

            //相依的 ROI 資料列
            var dependsRecordIDs = _DataList.Where(p => geoModel.DependGeoRowNames.Contains(p.RecordID) && p.ROIID != null).Select(p => p.RecordID);

            //找到樹狀結構中相對應的 ROI 節點
            var nodes = _TreeViewContainer.Nodes.Cast<TreeNode>().Where(p => dependsRecordIDs.Contains(p.Name));
            foreach (TreeNode pNode in nodes)
            {
                //add subNode
                var geoNode = getGeoTreeNode(geoModel);
                pNode.Nodes.Add(geoNode);
                HideCheckBox(_TreeViewContainer, geoNode);
            }
            _TreeViewContainer.Focus();
            _TreeViewContainer.SelectedNode = selectedNode;
            // */
        }
        /// <summary>
        /// 組成 GeoDataViewModel
        /// <para>把 ROI 轉成GeoDataViewModel</para>
        /// </summary>
        /// <param name="roiIndex">active ROI index</param>
        /// <param name="viewModel">MeasureViewModel</param>
        /// <param name="roi">ROI</param>
        /// <returns></returns>
        private GeoDataGridViewModel transferROIToGeoDataViewModel(MeasureViewModel viewModel, ROI roi, bool isAddNew)
        {
            var number = _DataList.Count + 1;
            var measureName = number.ToString("d2") + " " + roi.ROIMeasureType;
            var exportUnit = roi.ROIMeasureType == MeasureType.Angle ? "Angle" :
                            roi.ROIMeasureType == MeasureType.Point ? "" : _ExportUnit;

            var distance = (viewModel.Distance != null && viewModel.Distance.TupleLength() > 0) ?
                        viewModel.Distance.D : 0.0;

            //圓類型, 距離為半徑 or 直徑
            var isCircleType = (viewModel.GeoType == MeasureType.PointCircle || viewModel.GeoType == MeasureType.Circle);
            distance = (isCircleType) ? distance * _circleDistanceSetting : distance;

            var curCoordinate = _refCoordinate.SingleOrDefault(p => p.ID == _currentCoordinateID);
            var curSkew = _refSkew.SingleOrDefault(p => p.ID == _currentSkewID);
            GeoDataGridViewModel geoModel = new GeoDataGridViewModel()
            {
                Icon = getGeoViewModelIcon(roi),
                Name = measureName,
                ROIID = roi.ID,
                ROIModel = roi.ToROIViewModel(),
                Col1 = (viewModel.Col1 != null && viewModel.Col1.TupleLength() > 0) ?
                        viewModel.Col1.D : -1.0,
                Row1 = (viewModel.Row1 != null && viewModel.Row1.TupleLength() > 0) ?
                        viewModel.Row1.D : -1.0,
                Distance = distance,
                WorldDistance = pixelToRealWorldValue(distance),

                Col2 = (viewModel.Col2 != null && viewModel.Col2.TupleLength() > 0) ?
                        viewModel.Col2.D : -1.0,

                Row2 = (viewModel.Row2 != null && viewModel.Row2.TupleLength() > 0) ?
                        viewModel.Row2.D : -1.0,
                Selected = false,
                Unit = exportUnit,
                GeoType = roi.ROIMeasureType,
            };
            var arcRoi = roi as SmartArc;
            if (arcRoi != null)
            {
                var roiModelData = arcRoi.getModelData();
                geoModel.StartPhi = roiModelData[3];
                geoModel.EndPhi = roiModelData[4];
            }

            if (isAddNew)
            {
                if (curCoordinate != null)
                {
                    geoModel.CoordinateID = curCoordinate.ID;
                    geoModel.CoordinateName = curCoordinate.Name;
                }
            }
            //設定參考座標值
            double refCoordinateCol, refCoordinateRow;
            getRefCoordinate(geoModel, out refCoordinateCol, out refCoordinateRow);
            geoModel.CoordinateCol = refCoordinateCol;
            geoModel.CoordinateRow = refCoordinateRow;

            //計算軸擺正
            if (curSkew != null)
            {
                geoModel.SkewID = curSkew.ID;
                geoModel.SkewName = curSkew.Name;
                geoModel.Skew = getSkew(geoModel.SkewID);
            }
            return geoModel;
        }
        private bool deleteGridViewRecord(GeoDataGridViewModel model)
        {
            var hasROIDependencyModels = _DataList.Where(p => p.RecordID != model.RecordID && p.DependGeoRowNames != null);
            var relatedModelIDs = hasROIDependencyModels.Where(q => q.DependGeoRowNames.Contains(model.RecordID)).Select(p => p.RecordID);
            string message = (relatedModelIDs.Count() > 0) ? Hanbo.Resources.Resource.Message_DependencyWarning
                                                            : Hanbo.Resources.Resource.Message_DeleteNotice;
            var confirmDelete = MessageBox.Show(message, Hanbo.Resources.Resource.Message_Confirm, MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes;
            if (confirmDelete)
            {
                //參考我的座標的資料列
                RemoveRefCoordinate(model.RecordID);

                RemoveRefSkew(model.RecordID);

                //刪除相依的 Model
                var modelROIID = model.ROIID;
                var deletedRows = _DataList.Where(p => relatedModelIDs.Contains(p.RecordID)).ToList();
                for (int i = 0; i < deletedRows.Count; i++)
                {
                    var row = deletedRows[i];
                    var recordID = row.RecordID;
                    RemoveRefCoordinate(row.RecordID);
                    RemoveRefSkew(row.RecordID);
                    _DataList.Remove(row);
                }
                _DataList.Remove(model);
                notifyRecordChanged(GeoDataGridViewNotifyType.DeleteRow, modelROIID);
            }
            return confirmDelete;
        }
        /// <summary>
        /// <para>*******************************</para>
        /// 更新與「我」相依的物件
        /// <para>Ex: 物件相依關系如下</para>
        /// <para> A </para>
        /// <para> B </para>
        /// <para> C 由 A, B 構成 </para>
        /// <para>--------------------------------------</para>
        /// <para> 則 A 或 B 異動時, 其相依物件 C 需被更新 </para>
        /// <para>*******************************</para>
        /// </summary>
        /// <param name="geoParent">傳入小孩的父親,即目前被異動的物件</param>
        private void updateDependGeoObject(GeoDataGridViewModel geoParent)
        {
            //去除自已以外,其他有相依的資料列們
            var hasDependObjectRecords = _DataList.Where(p => p.DependGeoRowNames != null
                                                    && p.RecordID != geoParent.RecordID);

            //與本列相關的資料列
            var oneToManyGeoList = hasDependObjectRecords.Where(q => q.DependGeoRowNames.Contains(geoParent.RecordID));

            foreach (var geoModel in oneToManyGeoList)
            {
                var firstID = geoModel.DependGeoRowNames.Length > 0 ? geoModel.DependGeoRowNames[0] : "";
                var secondID = geoModel.DependGeoRowNames.Length > 1 ? geoModel.DependGeoRowNames[1] : "";
                var thirdID = geoModel.DependGeoRowNames.Length > 2 ? geoModel.DependGeoRowNames[2] : "";
                var firstModel = _DataList.SingleOrDefault(p => p.RecordID == firstID);
                var secondModel = _DataList.SingleOrDefault(p => p.RecordID == secondID);
                var thirdModel = _DataList.SingleOrDefault(p => p.RecordID == thirdID);
                GeoDataGridViewModel newModel = null;
                switch (geoModel.GeoType)
                {
                    case MeasureType.Angle:
                        newModel = makeAngleGeoDataViewModel(firstModel, secondModel);
                        break;
                    case MeasureType.CrossPoint:
                        newModel = makeCrossPointGeoDataViewModel(firstModel, secondModel);
                        break;
                    case MeasureType.Distance:
                        newModel = makeDistanceGeoDataViewModel(firstModel, secondModel);
                        break;
                    case MeasureType.DistanceX:
                        newModel = makeDistanceXGeoDataViewModel(firstModel, secondModel);
                        break;
                    case MeasureType.DistanceY:
                        newModel = makeDistanceYGeoDataViewModel(firstModel, secondModel);
                        break;
                    case MeasureType.PointCircle:
                        newModel = make3PointToCircleGeoDataViewModel(firstModel, secondModel, thirdModel);
                        break;
                    case MeasureType.SymmetryLine:
                        newModel = makeSymmetryLineGeoDataViewModel(firstModel, secondModel);
                        break;
                }
                reAssignModelValue(geoModel, newModel);

                //更新參考"我"座標的物件
                updateDependOnCoordinateObjects(geoModel);

                //更新參考我作為軸擺正的物件
                updateDependOnSkewObjects(geoModel);
            }
        }
 /// <summary>
 /// 我的位置 - 我參考的座標的位置
 /// <para>****取得參考座標位置****</para>
 /// </summary>
 /// <param name="geoModel">我</param>
 /// <param name="coordinateCol"></param>
 /// <param name="coordinateRow"></param>
 private void getRefCoordinate(GeoDataGridViewModel geoModel, out double coordinateCol, out double coordinateRow)
 {
     coordinateCol = geoModel.Col1;
     coordinateRow = geoModel.Row1;
     var refCoordinateModel = _DataList.SingleOrDefault(p => p.RecordID == geoModel.CoordinateID);
     if (refCoordinateModel != null)
     {
         //影像座標 - 參考座標
         coordinateCol = geoModel.Col1 - refCoordinateModel.Col1;
         coordinateRow = geoModel.Row1 - refCoordinateModel.Row1;
     }
 }
 /// <summary>
 /// 更新參考我的座標的物件
 /// </summary>
 /// <param name="coordinateModel"></param>
 private void updateDependOnCoordinateObjects(GeoDataGridViewModel coordinateModel)
 {
     foreach (var model in _DataList.Where(p => p.CoordinateID == coordinateModel.RecordID))
     {
         model.CoordinateRow = model.Row1 - coordinateModel.Row1;
         model.CoordinateCol = model.Col1 - coordinateModel.Col1;
     }
 }
 /// <summary>
 /// 轉換為 工程圖 ROI
 /// </summary>
 /// <param name="raw"></param>
 /// <param name="dependROIs"></param>
 /// <returns></returns>
 public ROI ConvertToProgROI(GeoDataGridViewModel raw, GeoDataGridViewModel[] dependROIs)
 {
     return ConvertToProgROI(raw, dependROIs, 1);
 }
 /// <summary>
 /// 更新參考我作為軸擺正的物件
 /// </summary>
 /// <param name="rowModel"></param>
 private void updateDependOnSkewObjects(GeoDataGridViewModel rowModel)
 {
     var isSkewModel = _refSkew.Any(p => p.ID == rowModel.RecordID);
     if (isSkewModel)
     {
         //參考我的物件們
         var models = _DataList.Where(p => p.SkewID == rowModel.RecordID);
         var skewValue = getSkew(rowModel.RecordID);
         foreach (var model in models)
         {
             model.Skew = skewValue;
         }
     }
 }
        private ProgGraphicModel convertToProgGraphicModel(GeoDataGridViewModel raw, GeoDataGridViewModel[] dependROIs)
        {
            var model = assignValue(raw);

            /*var basicGeoType = new List<MeasureType>() {
                {MeasureType.FitLine},
                {MeasureType.Line},
                {MeasureType.Point},
                {MeasureType.Circle}
            };
             */
            //有相依的ROI
            var basicROIs = dependROIs;//.Where(p => basicGeoType.Contains(p.GeoType)).ToArray();
            int dependROICount = basicROIs.Length;
            if (dependROICount > 0)
            {
                model.ROIs = new ProgGraphicModel[dependROICount];
                for (int i = 0; i < dependROICount; i++)
                {
                    var dependROI = basicROIs[i];

                    var dependItem = assignValue(dependROI);
                    model.ROIs[i] = dependItem;
                }
            }
            return model;
        }
        /// <summary>
        /// 更新 ViewModel
        /// <para>有 ROI model 的資料列更新</para>
        /// </summary>
        /// <param name="recordID">RecordID</param>
        /// <param name="tmpGeoDataViewModel"></param>
        private void updateROIRecord(string recordID, GeoDataGridViewModel tmpGeoDataViewModel)
        {
            var rowModel = _DataList.SingleOrDefault(p => p.RecordID == recordID);
            if (rowModel != null)
            {
                //
                var newDistance = tmpGeoDataViewModel.Distance;
                double coordinateCol, coordinateRow;
                getRefCoordinate(rowModel, out coordinateCol, out coordinateRow);

                //參考座標異動
                rowModel.CoordinateRow = coordinateRow;
                rowModel.CoordinateCol = coordinateCol;

                rowModel.Col1 = tmpGeoDataViewModel.Col1;
                rowModel.Row1 = tmpGeoDataViewModel.Row1;
                rowModel.Distance = newDistance;
                rowModel.WorldDistance = pixelToRealWorldValue(newDistance);
                rowModel.Col2 = tmpGeoDataViewModel.Col2;
                rowModel.Row2 = tmpGeoDataViewModel.Row2;
                rowModel.ROIModel = tmpGeoDataViewModel.ROIModel;

                //更新參考我的座標的物件
                updateDependOnCoordinateObjects(rowModel);

                //更新參考我作為軸擺正的物件
                updateDependOnSkewObjects(rowModel);

                //更新與此Geo 相關的 Geo Objects
                updateDependGeoObject(rowModel);

            }
        }
 /// <summary>
 /// 建立文字及圖形
 /// </summary>
 /// <param name="model"></param>
 /// <param name="textOnly">是否只建立文字</param>
 /// <returns></returns>
 public static ResultDisplayViewModel CreateDisplayViewModel(GeoDataGridViewModel model, bool textOnly)
 {
     return CreateDisplayViewModel(model, textOnly, 1);
 }
 /// <summary>
 /// <para>***************</para>
 /// 位置及距離數值設為 -1
 /// <para>***************</para>
 /// </summary>
 /// <param name="model"></param>
 private static void modelSetToDefault(GeoDataGridViewModel model)
 {
     model.Row1 = model.Col1 = -1;
     model.Row2 = model.Col2 = -1;
     model.Distance = model.WorldDistance = -1;
     model.CoordinateCol = model.CoordinateRow = -1;
 }
        public static ResultDisplayViewModel CreateDisplayViewModel(GeoDataGridViewModel model, bool textOnly, int circleDistanceSetting)
        {
            ResultDisplayViewModel viewModel = null;

            try
            {
                //init
                var dispXLD = new HXLDCont();
                dispXLD.Dispose();
                dispXLD.GenEmptyObj();

                double posX = model.Col1, posY = model.Row1;
                string dispName = model.Name;

                switch (model.GeoType)
                {
                    case ViewROI.MeasureType.Angle:
                        break;

                    case ViewROI.MeasureType.Circle:
                    case ViewROI.MeasureType.PointCircle:
                        var radius = model.Distance / circleDistanceSetting;
                        dispXLD.GenCircleContourXld(model.Row1, model.Col1, radius, 0.0, 6.28318, "positive", 1.0);
                        viewModel = new ResultDisplayViewModel()
                        {
                            DisplayText = dispName,
                            PositionX = posX,
                            PositionY = posY,
                        };
                        break;

                    case ViewROI.MeasureType.CrossPoint:
                    case ViewROI.MeasureType.Point:
                        dispXLD.GenCrossContourXld(model.Row1, model.Col1, 12, 0.785398);
                        viewModel = new ResultDisplayViewModel()
                        {
                            DisplayText = dispName,
                            PositionX = posX,
                            PositionY = posY,
                        };
                        break;

                    case ViewROI.MeasureType.Distance:
                    case ViewROI.MeasureType.DistanceX:
                    case ViewROI.MeasureType.DistanceY:
                    case ViewROI.MeasureType.FitLine:
                    case ViewROI.MeasureType.Line:
                    case ViewROI.MeasureType.SymmetryLine:
                        var arrowXLD = new HXLDCont();
                        //dispXLD.GenContourPolygonXld(new double[] { model.Row1, model.Row2 }, new double[] { model.Col1, model.Col2 });
                        posX = (model.Col1 + model.Col2) / 2.0;
                        posY = (model.Row1 + model.Row2) / 2.0;

                        viewModel = new ResultDisplayViewModel()
                        {
                            DisplayText = dispName,
                            PositionX = posX,
                            PositionY = posY,
                            FirstArrowX = model.Col1,
                            FirstArrowY = model.Row1,
                            SecArrowX = model.Col2,
                            SecArrowY = model.Row2,
                        };
                        break;
                }
                //
                if (!textOnly && viewModel != null)
                    viewModel.ImageXLD = dispXLD;

            }
            catch (Exception ex)
            {
                Hanbo.Log.LogManager.Error(ex);
            }

            return viewModel;
        }
 /// <summary>
 /// 新增量測記錄 (distance, symmetrylin, angle, 3pointCircle) 
 /// <para>Tree View</para>
 /// </summary>
 /// <param name="geoModel"></param>
 private void addMeasuredTreeNode(GeoDataGridViewModel geoModel)
 {
     if (_TreeViewContainer != null)
     {
         //addSubNodeBaseOnROIMeasureElement(geoModel);
         var parentNode = getGeoTreeNode(geoModel);
         _TreeViewContainer.Nodes.Add(parentNode);
         //Depend models as child node
         foreach (var recordID in geoModel.DependGeoRowNames)
         {
             //depend model
             var model = _DataList.SingleOrDefault(p => p.RecordID == recordID);
             if (model != null)
             {
                 var childNode = getGeoTreeNode(model);
                 parentNode.Nodes.Add(childNode);
                 //childNode.
                 HideCheckBox(_TreeViewContainer, childNode);
             }
         }
         _TreeViewContainer.Focus();
         _TreeViewContainer.SelectedNode = parentNode;
     }
 }