프로젝트

일반

사용자정보

개정판 4d2571ab

ID4d2571ab7de9d394e6492c86f7cba7faf9bda823
상위 b9cc9254
하위 a816891a, 6a7573b0

gaqhf 이(가) 5년 이상 전에 추가함

dev issue #683 : 우선순위 Symbol 모델링 추가 - 1. Angle Valve, 2. 3개의 Symbol이 연결되있는 경우, 3. Connector가 3개 이상인 Symbol 순으로 모델링

Change-Id: I3faf7ec8f8e50eb80e8fcc427c65d5d2cbfdd477

차이점 보기:

DTI_PID/SPPIDConverter/AutoModeling.cs
3 3
using System.Linq;
4 4
using System.Text;
5 5
using System.Threading.Tasks;
6
using System.Data;
6 7
using Llama;
7 8
using Plaice;
8 9
using Ingr.RAD2D.Interop.RAD2D;
......
102 103
                    SplashScreenManager.Default.SendCommand(SPPIDSplashScreen.SplashScreenCommand.SetAllStep, AllCount);
103 104
                    SplashScreenManager.Default.SendCommand(SPPIDSplashScreen.SplashScreenCommand.SetDocumentName, DocumentLabelText);
104 105

  
105
                    SplashScreenManager.Default.SendCommand(SPPIDSplashScreen.SplashScreenCommand.SetStep, "Group Symbol Modeling");
106
                    List<List<Symbol>> symbolGroups = SPPIDUtil.GetThreeConnectedSymbolGroup(document);
107
                    foreach (List<Symbol> symbolGroup in symbolGroups)
108
                        SymbolModelingByThreeSymbolGroup(symbolGroup);
106
                    //SplashScreenManager.Default.SendCommand(SPPIDSplashScreen.SplashScreenCommand.SetStep, "Group Symbol Modeling");
107
                    //List<List<Symbol>> symbolGroups = SPPIDUtil.GetThreeConnectedSymbolGroup(document);
108
                    //foreach (List<Symbol> symbolGroup in symbolGroups)
109
                    //    SymbolModelingByThreeSymbolGroup(symbolGroup);
110

  
111
                    SplashScreenManager.Default.SendCommand(SPPIDSplashScreen.SplashScreenCommand.SetStep, "Priority Symbol Modeling");
112
                    List<Symbol> prioritySymbols = GetPrioritySymbol();
113
                    foreach (var item in prioritySymbols)
114
                        SymbolModelingByPriority(item);
109 115

  
110 116
                    // Equipment Modeling
111 117
                    SplashScreenManager.Default.SendCommand(SPPIDSplashScreen.SplashScreenCommand.SetStep, "Equipments Modeling");
......
456 462
        /// <param name="prevSymbol"></param>
457 463
        private void SymbolModeling(Symbol symbol, Symbol targetSymbol)
458 464
        {
465
#if DEBUG
466
            try
467
            {
468
#endif
459 469
            // OWNERSYMBOL Attribute, 값을 가지고 있을 경우
460 470
            BaseModel.Attribute itemAttribute = symbol.ATTRIBUTES.Find(attr => attr.ATTRIBUTE == "OWNERSYMBOL");
461 471
            if (itemAttribute != null && string.IsNullOrEmpty(itemAttribute.VALUE) && itemAttribute.VALUE != "None")
......
504 514

  
505 515
            ReleaseCOMObjects(_LMSymbol);
506 516
            SplashScreenManager.Default.SendCommand(SPPIDSplashScreen.SplashScreenCommand.SetProgress, ++CurrentCount);
517
#if DEBUG
518

  
519
            }
520
            catch (Exception ex)
521
            {
522
                System.Windows.Forms.MessageBox.Show(ex.StackTrace);
523
            }
524
#endif
507 525
        }
508 526

  
509 527
        /// <summary>
......
792 810
            SplashScreenManager.Default.SendCommand(SPPIDSplashScreen.SplashScreenCommand.SetProgress, ++CurrentCount);
793 811
        }
794 812

  
795
        /// <summary>
796
        /// 3개의 Symbol이 붙어있을경우 CenterSymbol을 Grid기준으로 맞추기 위해서 모델링
797
        /// </summary>
798
        /// <param name="group"></param>
799
        private void SymbolModelingByThreeSymbolGroup(List<Symbol> group)
813
        private void SymbolModelingByPriority(Symbol symbol)
800 814
        {
801
            // Group의 가운데 찾기
802
            Symbol symbol1 = null;
803
            Symbol symbol2 = null;
804
            Symbol centerSymbol = null;
805
            foreach (var symbol in group)
806
            {
807
                int count = 0;
808
                foreach (var connector in symbol.CONNECTORS)
809
                {
810
                    object item = SPPIDUtil.FindObjectByUID(document, connector.CONNECTEDITEM);
811
                    if (item != null && item.GetType() == typeof(Symbol))
812
                        count++;
813
                }
815
            // Angle, Center, 우선순위 모델링
816
            SymbolModeling(symbol, null);
817
            List<Symbol> group = new List<Symbol>() { symbol };
818
            SPPIDUtil.FindConnectedSymbolGroup(document, symbol, group);
814 819

  
815
                // Center Symbol
816
                if (count == 2)
820
            List<Symbol> endModeling = new List<Symbol>() { symbol };
821
            while (endModeling.Count != group.Count)
822
            {
823
                foreach (var item in group)
817 824
                {
818
                    SymbolModeling(symbol, null);
819
                    centerSymbol = symbol;
825
                    if (!endModeling.Contains(item))
826
                    {
827
                        bool result = false;
828
                        foreach (var connector in item.CONNECTORS)
829
                        {
830
                            Symbol connSymbol = group.Find(x => x.UID == connector.CONNECTEDITEM);
831
                            if (connSymbol == item)
832
                                throw new Exception(connSymbol.UID);
833

  
834
                            if (connSymbol != null && endModeling.Contains(connSymbol))
835
                            {
836
                                SymbolModeling(item, connSymbol);
837
                                endModeling.Add(item);
838
                                result = true;
839
                                break;
840
                            }
841
                        }
842

  
843
                        if (result)
844
                            break;
845
                    }
820 846
                }
821
                else if (symbol1 == null)
822
                    symbol1 = symbol;
823
                else
824
                    symbol2 = symbol;
825 847
            }
826

  
827
            SymbolModeling(symbol1, centerSymbol);
828
            SymbolModeling(symbol2, centerSymbol);
829 848
        }
830 849

  
831 850
        /// <summary>
......
1064 1083
                    line.SPPID.ModelItemId = _lMConnector.ModelItemID;
1065 1084
                _lMConnector.Commit();
1066 1085
                if (startBranchLine != null || endBranchLine != null)
1067
                {
1068 1086
                    BranchLines.Add(new Tuple<string, Line, Line>(_lMConnector.ModelItemID, startBranchLine, endBranchLine));
1069
                }
1070 1087
            }
1071 1088

  
1072

  
1073 1089
            if (_LMSymbol1 != null)
1074 1090
                ReleaseCOMObjects(_LMSymbol1);
1075 1091
            if (_LMSymbol2 != null)
......
2406 2422
        }
2407 2423

  
2408 2424
        /// <summary>
2425
        /// Symbol의 우선순위 Modeling 목록을 가져온다.
2426
        /// 1. Angle Valve
2427
        /// 2. 3개로 이루어진 Symbol Group
2428
        /// </summary>
2429
        /// <returns></returns>
2430
        private List<Symbol> GetPrioritySymbol()
2431
        {
2432
            DataTable symbolTable = document.SymbolTable;
2433

  
2434
            // List에 순서대로 쌓는다.
2435
            List<Symbol> symbols = new List<Symbol>();
2436
            // Angle Valve 부터
2437
            foreach (var symbol in document.SYMBOLS.FindAll(x => x.CONNECTORS.Count == 2))
2438
            {
2439
                if (!symbols.Contains(symbol))
2440
                {
2441
                    double originX = 0;
2442
                    double originY = 0;
2443

  
2444
                    // ID2 Table에서 Original Point 가져옴.
2445
                    string OriginalPoint = symbolTable.Select(string.Format("UID = {0}",symbol.DBUID))[0]["OriginalPoint"].ToString();
2446
                    SPPIDUtil.ConvertPointBystring(OriginalPoint, ref originX, ref originY);
2447

  
2448
                    SlopeType slopeType1 = SlopeType.None;
2449
                    SlopeType slopeType2 = SlopeType.None;
2450
                    foreach (Connector connector in symbol.CONNECTORS)
2451
                    {
2452
                        double connectorX = 0;
2453
                        double connectorY = 0;
2454
                        SPPIDUtil.ConvertPointBystring(connector.CONNECTPOINT, ref connectorX, ref connectorY);
2455
                        if (slopeType1 == SlopeType.None)
2456
                            slopeType1 = SPPIDUtil.CalcSlope(originX, originY, connectorX, connectorY);
2457
                        else
2458
                            slopeType2 = SPPIDUtil.CalcSlope(originX, originY, connectorX, connectorY);
2459
                    }
2460

  
2461
                    if ((slopeType1 == SlopeType.VERTICAL && slopeType2 == SlopeType.HORIZONTAL) ||
2462
                        (slopeType2 == SlopeType.VERTICAL && slopeType1 == SlopeType.HORIZONTAL))
2463
                        symbols.Add(symbol);
2464
                }
2465
            }
2466

  
2467
            // 3개의 Symbol이 뭉쳐 있을 때
2468
            foreach (var item in document.SYMBOLS)
2469
            {
2470
                List<Symbol> group = new List<Symbol>();
2471
                SPPIDUtil.FindConnectedSymbolGroup(document, item, group);
2472
                if (group.Count == 3)
2473
                {
2474
                    Symbol symbol = SPPIDUtil.FindCenterAtThreeSymbols(document, group);
2475
                    if (!symbols.Contains(symbol))
2476
                        symbols.Add(symbol);
2477
                }
2478
            }
2479

  
2480
            // Connection Point가 3개 이상
2481
            foreach (var symbol in document.SYMBOLS)
2482
                if (symbol.CONNECTORS.Count > 2 && !symbols.Contains(symbol))
2483
                    symbols.Add(symbol);
2484

  
2485
            return symbols;
2486
        }
2487

  
2488
        /// <summary>
2409 2489
        /// Graphic OID로 해당 Symbol의 크기를 구하여 Zoom
2410 2490
        /// </summary>
2411 2491
        /// <param name="graphicOID"></param>

내보내기 Unified diff

클립보드 이미지 추가 (최대 크기: 500 MB)