프로젝트

일반

사용자정보

통계
| 개정판:

hytos / DTI_PID / SPPIDConverter_AutoModeling / Modeling / AutoModeling.cs @ b8ff72eb

이력 | 보기 | 이력해설 | 다운로드 (32.4 KB)

1
using System;
2
using System.Windows.Forms;
3
using System.Collections.Generic;
4
using System.Drawing;
5
using System.Linq;
6
using System.Text;
7
using System.Threading.Tasks;
8
using System.Xml.Linq;
9
using Llama;
10
using Plaice;
11
using SPPID.Model;
12
using SPPID.Utill;
13
using System.Diagnostics;
14

    
15

    
16
namespace SPPID.Modeling
17
{
18
    public class AutoModeling
19
    {
20
        private Document document;
21

    
22
        public AutoModeling(Document doc)
23
        {
24
            document = doc;
25
        }
26

    
27
        public void Run()
28
        {
29
            Stopwatch sw = new Stopwatch();
30
            sw.Start();
31
            CloseOPCForm.Run();
32

    
33
            // Group Symbol 실패시 Group Remove
34
            foreach (Group group in document.GROUPS)
35
            {
36
                if (!GroupSymbolModeling(group))
37
                {
38
                    group.Enable = false;
39
                }
40
            }
41

    
42
            // Line Group은 Group 없을 때까지 Loop
43
            while (document.GROUPS.Count > 0)
44
            {
45
                bool loopAction = false;
46
                foreach (Group group in document.GROUPS)
47
                {
48
                    if (!group.Enable)
49
                        continue;
50

    
51
                    if (IsPossibleDrawGroupLine(group))
52
                    {
53
                        loopAction = true;
54
                        GroupLineModeling(group);
55
                        document.GROUPS.Remove(group);
56
                        break;
57
                    }
58
                }
59
                if (!loopAction)
60
                    break;
61
            }
62
            
63
            // Line Group Modeling 실패한 로그
64
            foreach (Group group in document.GROUPS)
65
            {
66
                foreach (SPPID_ITEM item in group.Items)
67
                {
68
                    Line line = item as Line;
69
                    if (line != null && line.SPPID_ITEM_OBJECT == null)
70
                    {
71
                        
72
                    }
73
                }
74
            }
75

    
76
            // SprecBreak Modeling
77
            foreach (SpecBreak item in document.SPECBREAK)
78
            {
79
                item.Modeling(document);
80
                item.SetAttribute(document);
81
                foreach (var result in item.SPPID_ITEM_OBJECT_LIST)
82
                {
83
                    LMLabelPersist label = result.Value;
84
                    if (label != null)
85
                    {
86
                        
87
                    }
88
                    else
89
                    {
90
                        
91
                    }
92
                }
93
            }
94

    
95
            // Text Modeling
96
            foreach (Text text in document.TEXTS)
97
            {
98
                text.Modeling(document);
99
                if (text.SPPID_ITEM_OBJECT != null || text.IsAssociation)
100
                {
101

    
102
                }
103
                else
104
                {
105
                    
106
                }
107
            }
108

    
109
            // attribute
110
            foreach (Symbol item in document.SYMBOLS)
111
            {
112
                if (item.SPPID_ITEM_OBJECT != null)
113
                {
114
                    item.SetAttribute(document);
115
                }
116
            }
117

    
118
            // Line Number Attribute Modeling
119
            foreach (LineNumber lineNumber in document.LINENUMBERS)
120
            {
121
                lineNumber.SetAttribute(document);
122
            }
123

    
124
            CloseOPCForm.Stop();
125
            
126
            //
127
            sw.Stop();
128
            TimeSpan ts = sw.Elapsed;
129
            string elapsedTime = String.Format("{0:00}:{1:00}.{2:00}",
130
            ts.Minutes, ts.Seconds,
131
            ts.Milliseconds / 10);
132
            //Log.WriteLine(new ListBoxItem(string.Format("Time : {0}", ts), Color.Black), logListBox);
133
        }
134

    
135
        private bool IsPossibleDrawGroupLine(Group group)
136
        {
137
            foreach (SPPID_ITEM item in group.Items)
138
            {
139
                if (item.GetType() == typeof(Symbol))
140
                {
141
                    Symbol symbol = item as Symbol;
142
                    foreach (Connector connector in symbol.CONNECTORS)
143
                    {
144
                        SPPID_ITEM objItem = SPPIDUtill.FindObjectByUID(document, connector.CONNECTEDITEM) as SPPID_ITEM;
145
                        if (objItem != null && !group.Items.Contains(objItem) && objItem.SPPID_ITEM_OBJECT == null)
146
                            return false;
147
                    }
148
                }
149
                else if (item.GetType() == typeof(Line))
150
                {
151
                    Line line = item as Line;
152
                    foreach (Connector connector in line.CONNECTORS)
153
                    {
154
                        SPPID_ITEM objItem = SPPIDUtill.FindObjectByUID(document, connector.CONNECTEDITEM) as SPPID_ITEM;
155
                        if (objItem != null && !group.Items.Contains(objItem) && objItem.SPPID_ITEM_OBJECT == null)
156
                            return false;
157
                    }
158
                }
159
            }
160

    
161
            return true;
162
        }
163

    
164
        #region Modeling
165

    
166
        private bool GroupSymbolModeling(Group group)
167
        {
168
            List<object> Items = group.Items;
169
            Symbol prevSymbol = null;
170
            int prevIndex = 0;
171
            bool result = true;
172

    
173
            for (int itemIndex = 0; itemIndex < Items.Count(); itemIndex++)
174
            {
175
                Line.SlopeType prevSlope = Line.SlopeType.NONE;
176
                Symbol symbol = Items[itemIndex] as Symbol;
177
                try
178
                {
179
                    if (symbol != null)
180
                    {
181
                        // Group중에 최근에 Modeling된 Symbol
182
                        if (prevSymbol != null)
183
                        {
184
                            LMSymbol prevLMSymbol = prevSymbol.SPPID_ITEM_OBJECT as LMSymbol;
185
                            for (int prevLineIndex = prevIndex + 1; prevLineIndex < itemIndex; prevLineIndex++)
186
                            {
187
                                Line prevLine = Items[prevLineIndex] as Line;
188
                                if (prevLine != null)
189
                                {
190
                                    if (prevSlope == Line.SlopeType.NONE)
191
                                    {
192
                                        prevSlope = prevLine.SLOPTYPE;
193
                                    }
194
                                    else if (prevSlope != prevLine.SLOPTYPE)
195
                                    {
196
                                        prevSlope = Line.SlopeType.NONE;
197
                                        break;
198
                                    }
199
                                }
200
                            }
201

    
202
                            if (prevSlope == Line.SlopeType.HORIZONTAL)
203
                                symbol.LOCATION_Y = prevLMSymbol.get_YCoordinate();
204
                            else if (prevSlope == Line.SlopeType.VERTICAL)
205
                                symbol.LOCATION_X = prevLMSymbol.get_XCoordinate();
206
                        }
207

    
208
                        symbol.Modeling(document);
209
                        if (symbol.SPPID_ITEM_OBJECT != null)
210
                        {
211
                            prevSymbol = symbol;
212
                            prevIndex = itemIndex;
213
                        }
214
                        else
215
                        {
216
                            result = false;
217
                        }
218
                    }
219
                }
220
                catch (Exception ex)
221
                {
222
                    result = false;
223
                    return result;
224
                }
225

    
226
                
227
            }
228

    
229
            return result;
230
        }
231

    
232
        private bool GroupLineModeling(Group group)
233
        {
234
            try
235
            {
236
                List<object> Items = group.Items;
237
                List<Line> lineList = new List<Line>();
238
                foreach (SPPID_ITEM item in Items)
239
                {
240
                    Line line = item as Line;
241
                    if (line != null)
242
                        lineList.Add(line);
243
                    else if (lineList.Count > 0)
244
                    {
245
                        GroupLineModelingByList(lineList, group);
246
                    }
247
                }
248

    
249
                if (lineList.Count > 0)
250
                    GroupLineModelingByList(lineList, group);
251
            }
252
            catch (Exception ex)
253
            {
254
                Log.WriteLine(ex);
255
                return false;
256
            }
257

    
258
            return true;
259
        }
260

    
261
        private void GroupLineModelingByList(List<Line> lines, Group group)
262
        {
263
            List<PointInfo> pointInfos = GetLinePointInfos(lines, group);
264
            LMConnector lMConnector = DrawLines(pointInfos, lines[0].SPPIDMAPPINGNAME, lines);
265

    
266
            if (lMConnector != null)
267
            {
268
                string modelId = lMConnector.ModelItemID;
269
                document.PipeRunPoint.Add(lMConnector.ModelItemID, pointInfos);
270
                foreach (Line line in lines)
271
                {
272
                    line.SPPID_ITEM_OBJECT = modelId;
273
                    IfContainLineNumber(line.UID);
274
                }
275
            }
276
            else
277
            {
278
                foreach (Line line in lines)
279
                {
280
                    //Log.WriteLine(new ListBoxItem(string.Format("Fail Line UID : {0}", line.UID), Color.Red), logListBox);
281
                    //Log.ProgressBarIncrement(progressBar);
282
                }
283
            }
284

    
285
            lines.Clear();
286
        }
287

    
288
        private void IfContainLineNumber(string lineUID)
289
        {
290
            foreach (LineNumber lineNumber in document.LINENUMBERS)
291
            {
292
                if (lineNumber.CONNECTLINE == lineUID)
293
                {
294
                    lineNumber.Modeling(document);
295

    
296
                    if (lineNumber.SPPID_ITEM_OBJECT != null)
297
                    {
298

    
299
                    }
300
                    else
301
                    {
302

    
303
                    }
304
                    break;
305
                }
306
            }
307
        }
308

    
309
        private LMConnector DrawLines(List<PointInfo> pointInfos, string SPPID_MAPPINGNAME, List<Line> lines)
310
        {
311
            LMConnector lMConnector = null;
312
            try
313
            {
314
                Placement _placement = new Placement();
315
                _LMAItem _LMAItem = _placement.PIDCreateItem(SPPID_MAPPINGNAME);
316
                PlaceRunInputs placeRunInputs = new PlaceRunInputs();
317

    
318
                PointInfo branchPoint1 = null;
319
                PointInfo branchPoint1_1 = null;
320
                int branchIndex1 = 0;
321
                List<string> branch_SP_ID_List1 = null;
322
                PointInfo branchPoint2 = null;
323
                PointInfo branchPoint2_1 = null;
324
                int branchIndex2 = 0;
325
                List<string> branch_SP_ID_List2 = null;
326

    
327

    
328
                for (int pointIndex = 0; pointIndex < pointInfos.Count; pointIndex++)
329
                {
330
                    PointInfo pointInfo = pointInfos[pointIndex];
331
                    if (pointIndex == 0 || pointIndex == pointInfos.Count - 1)
332
                    {
333
                        if (pointInfo.ConnectedItemObject == null)
334
                        {
335
                            placeRunInputs.AddPoint(pointInfo.X, pointInfo.Y);
336
                        }
337
                        else
338
                        {
339
                            if (typeof(Symbol) == pointInfo.ConnectedItemObject.GetType())
340
                            {
341
                                Symbol symbol = pointInfo.ConnectedItemObject as Symbol;
342
                                //check child
343
                                List<string> linesUID = new List<string>();
344
                                foreach (Line line in lines)
345
                                    linesUID.Add(line.UID);
346

    
347
                                int symbolIndex = 0;
348
                                foreach (Connector connector in symbol.CONNECTORS)
349
                                {
350
                                    if (linesUID.Contains(connector.CONNECTEDITEM))
351
                                    {
352
                                        symbolIndex = connector.INDEX;
353
                                        break;
354
                                    }
355
                                }
356
                                LMSymbol tartgetLMSymbol = null;
357
                                if (symbolIndex == 0)
358
                                    tartgetLMSymbol = symbol.SPPID_ITEM_OBJECT as LMSymbol;
359
                                else
360
                                {
361
                                    foreach (SymbolChild child in symbol.CHILD_LIST)
362
                                    {
363
                                        if (child.Index == symbolIndex)
364
                                        {
365
                                            tartgetLMSymbol = child.SPPID_ITEM_OBJECT as LMSymbol;
366
                                            break;
367
                                        }
368
                                    }
369
                                }
370
                                
371
                                placeRunInputs.AddSymbolTarget(tartgetLMSymbol, pointInfo.X, pointInfo.Y);
372
                                pointInfo.Type = PointInfo.PointType.Branch;
373
                            }
374
                            else if (typeof(Line) == pointInfo.ConnectedItemObject.GetType())
375
                            {
376
                                Line line = pointInfo.ConnectedItemObject as Line;
377
                                Tuple<LMConnector, int> targetLMConnector = GetTargetLMConnector(pointInfo);
378
                                if (targetLMConnector != null) 
379
                                {
380
                                    if (targetLMConnector.Item1 != null)
381
                                    {
382
                                        if (branchPoint1 == null)
383
                                        {
384
                                            placeRunInputs.AddConnectorTarget(targetLMConnector.Item1, pointInfo.X, pointInfo.Y);
385
                                            pointInfo.Type = PointInfo.PointType.Branch;
386
                                            branchPoint1 = new PointInfo(pointInfo.X, pointInfo.Y);
387
                                            branchPoint1.Type = PointInfo.PointType.Branch;
388
                                            branchPoint1.ConnectedItem = pointInfo.ConnectedItem;
389
                                            branchPoint1.ConnectedItemObject = pointInfo.ConnectedItemObject;
390
                                            branchIndex1 = targetLMConnector.Item2;
391
                                            branchPoint1_1 = pointInfo;
392

    
393
                                            branch_SP_ID_List1 = new List<string>();
394
                                            LMPipeRun lMPipeRun = _placement.PIDDataSource.GetPipeRun(line.SPPID_ITEM_OBJECT.ToString());
395
                                            foreach (LMRepresentation rep in lMPipeRun.Representations)
396
                                                if (rep.Attributes["RepresentationType"].get_Value() == "Branch" && rep.Attributes["ItemStatus"].get_Value() == "Active")
397
                                                    branch_SP_ID_List1.Add(rep.Id);
398
                                        }
399
                                        else
400
                                        {
401
                                            placeRunInputs.AddConnectorTarget(targetLMConnector.Item1, pointInfo.X, pointInfo.Y);
402
                                            pointInfo.Type = PointInfo.PointType.Branch;
403
                                            branchPoint2 = new PointInfo(pointInfo.X, pointInfo.Y);
404
                                            branchPoint2.Type = PointInfo.PointType.Branch;
405
                                            branchPoint2.ConnectedItem = pointInfo.ConnectedItem;
406
                                            branchPoint2.ConnectedItemObject = pointInfo.ConnectedItemObject;
407
                                            branchIndex2 = targetLMConnector.Item2;
408
                                            branchPoint2_1 = pointInfo;
409

    
410
                                            branch_SP_ID_List2 = new List<string>();
411
                                            LMPipeRun lMPipeRun = _placement.PIDDataSource.GetPipeRun(line.SPPID_ITEM_OBJECT.ToString());
412
                                            foreach (LMRepresentation rep in lMPipeRun.Representations)
413
                                                if (rep.Attributes["RepresentationType"].get_Value() == "Branch" && rep.Attributes["ItemStatus"].get_Value() == "Active")
414
                                                    branch_SP_ID_List2.Add(rep.Id);
415
                                        }
416
                                    }
417
                                    else
418
                                    {
419
                                        placeRunInputs.AddPoint(pointInfo.X, pointInfo.Y);
420
                                        pointInfo.Type = PointInfo.PointType.Run;
421
                                    }
422
                                }
423
                                else
424
                                {
425
                                    placeRunInputs.AddPoint(pointInfo.X, pointInfo.Y);
426
                                    pointInfo.Type = PointInfo.PointType.Run;
427
                                }
428
                            }
429
                        }
430
                    }
431
                    else
432
                    {
433
                        placeRunInputs.AddPoint(pointInfo.X, pointInfo.Y);
434
                        pointInfo.Type = PointInfo.PointType.Run;
435
                    }
436
                }
437

    
438
                lMConnector = _placement.PIDPlaceRun(_LMAItem, placeRunInputs);
439
                lMConnector.Commit();
440

    
441
                // Branch Point Setting
442
                if (branchPoint1 != null)
443
                {
444
                    Line branchedLine = branchPoint1.ConnectedItemObject as Line;
445
                    LMPipeRun lMPipeRun = _placement.PIDDataSource.GetPipeRun(branchedLine.SPPID_ITEM_OBJECT.ToString());
446
                    foreach (LMRepresentation rep in lMPipeRun.Representations)
447
                        if (rep.Attributes["RepresentationType"].get_Value() == "Branch" && rep.Attributes["ItemStatus"].get_Value() == "Active")
448
                        {
449
                            if (!branch_SP_ID_List1.Contains(rep.Id))
450
                            {
451
                                branchPoint1.SP_ID = rep.Id;
452
                                branchPoint1_1.SP_ID = rep.Id;
453
                                document.PipeRunPoint[branchedLine.SPPID_ITEM_OBJECT.ToString()].Insert(branchIndex1, branchPoint1);
454
                                break;
455
                            }
456
                        }
457

    
458
                    if (string.IsNullOrEmpty(branchPoint1.SP_ID))
459
                    {
460
                        document.PipeRunPoint[branchedLine.SPPID_ITEM_OBJECT.ToString()].RemoveAt(branchIndex1);
461
                        branchPoint1_1.Type = PointInfo.PointType.Run;
462
                    }
463
                }
464
                if (branchPoint2 != null)
465
                {
466
                    Line branchedLine = branchPoint2.ConnectedItemObject as Line;
467
                    LMPipeRun lMPipeRun = _placement.PIDDataSource.GetPipeRun(branchedLine.SPPID_ITEM_OBJECT.ToString());
468
                    foreach (LMRepresentation rep in lMPipeRun.Representations)
469
                        if (rep.Attributes["RepresentationType"].get_Value() == "Branch" && rep.Attributes["ItemStatus"].get_Value() == "Active")
470
                        {
471
                            if (!branch_SP_ID_List2.Contains(rep.Id))
472
                            {
473
                                branchPoint2.SP_ID = rep.Id;
474
                                branchPoint2_1.SP_ID = rep.Id;
475
                                document.PipeRunPoint[branchedLine.SPPID_ITEM_OBJECT.ToString()].Insert(branchIndex2, branchPoint2);
476
                                break;
477
                            }
478
                        }
479

    
480
                    if (string.IsNullOrEmpty(branchPoint2.SP_ID))
481
                    {
482
                        document.PipeRunPoint[branchedLine.SPPID_ITEM_OBJECT.ToString()].RemoveAt(branchIndex2);
483
                        branchPoint2_1.Type = PointInfo.PointType.Run;
484
                    }
485
                }
486
                // End
487
            }
488
            catch (Exception ex)
489
            {
490
                Log.WriteLine(ex);
491
            }
492

    
493
            return lMConnector;
494
        }
495

    
496
        private List<PointInfo> GetLinePointInfos(List<Line> lineList, Group group)
497
        {
498
            // Line들의 points를 구함
499
            List<PointInfo> pointInfos = new List<PointInfo>();
500
            if (lineList.Count == 1)
501
            {
502
                pointInfos.Add(new PointInfo(lineList[0].START_X, lineList[0].START_Y) { ConnectedItem = lineList[0].CONNECTORS[0].CONNECTEDITEM });
503
                pointInfos.Add(new PointInfo(lineList[0].END_X, lineList[0].END_Y) { ConnectedItem = lineList[0].CONNECTORS[1].CONNECTEDITEM });
504
            }
505
            else
506
            {
507
                for (int i = 0; i < lineList.Count; i++)
508
                    if (lineList.Count > i + 1)
509
                        GetLinePoints(lineList[i], lineList[i + 1], pointInfos);
510
            }
511

    
512
            // 맨앞 뒤의 ConnectedItem 구함
513
            for (int i = 0; i < pointInfos.Count; i++)
514
            {
515
                PointInfo info = pointInfos[i];
516
                if (i == 0 || pointInfos.Count - 1 == i)
517
                {
518
                    info.ConnectedItemObject = SPPIDUtill.FindObjectByUID(document, info.ConnectedItem) as SPPID_ITEM;
519

    
520
                    if (info.ConnectedItemObject == null)
521
                    {
522
                        info.Type = PointInfo.PointType.Run;
523
                    }
524
                    else
525
                    {
526
                        if (info.ConnectedItemObject.GetType() == typeof(Symbol))
527
                        {
528
                            Symbol symbol = info.ConnectedItemObject as Symbol;
529
                            LMSymbol _lmSymbol = symbol.SPPID_ITEM_OBJECT as LMSymbol;
530
                            info.SP_ID = _lmSymbol.AsLMRepresentation().Id;
531
                        }
532
                        info.Type = PointInfo.PointType.Branch;
533
                    }
534
                }
535
                else
536
                {
537
                    info.ConnectedItem = string.Empty;
538
                    info.Type = PointInfo.PointType.Run;
539
                }
540
                    
541
            }
542

    
543
            // 라인 보정
544
            CalibratePointInfos(pointInfos, lineList);
545

    
546
            return pointInfos;
547
        }
548

    
549
        private void GetLinePoints(Line line, Line nextLine, List<PointInfo> pointInfos)
550
        {
551
            if (nextLine != null)
552
            {
553
                if (pointInfos.Count > 0)
554
                    pointInfos.RemoveRange(pointInfos.Count - 2, 2);
555

    
556
                if (line.CONNECTORS[0].CONNECTEDITEM == nextLine.UID)
557
                {
558
                    pointInfos.Add(new PointInfo(line.END_X, line.END_Y) { ConnectedItem = line.CONNECTORS[1].CONNECTEDITEM });
559
                    pointInfos.Add(new PointInfo(line.START_X, line.START_Y) { ConnectedItem = line.CONNECTORS[0].CONNECTEDITEM });
560

    
561
                    if (nextLine.CONNECTORS[0].CONNECTEDITEM == line.UID)
562
                        pointInfos.Add(new PointInfo(nextLine.END_X, nextLine.END_Y) { ConnectedItem = nextLine.CONNECTORS[1].CONNECTEDITEM });
563
                    else if (nextLine.CONNECTORS[1].CONNECTEDITEM == line.UID)
564
                        pointInfos.Add(new PointInfo(nextLine.START_X, nextLine.START_Y) { ConnectedItem = nextLine.CONNECTORS[0].CONNECTEDITEM });
565

    
566
                }
567
                else if (line.CONNECTORS[1].CONNECTEDITEM == nextLine.UID)
568
                {
569
                    pointInfos.Add(new PointInfo(line.START_X, line.START_Y) { ConnectedItem = line.CONNECTORS[0].CONNECTEDITEM });
570
                    pointInfos.Add(new PointInfo(line.END_X, line.END_Y) { ConnectedItem = line.CONNECTORS[1].CONNECTEDITEM });
571

    
572
                    if (nextLine.CONNECTORS[0].CONNECTEDITEM == line.UID)
573
                        pointInfos.Add(new PointInfo(nextLine.END_X, nextLine.END_Y) { ConnectedItem = nextLine.CONNECTORS[1].CONNECTEDITEM });
574
                    else if (nextLine.CONNECTORS[1].CONNECTEDITEM == line.UID)
575
                        pointInfos.Add(new PointInfo(nextLine.START_X, nextLine.START_Y) { ConnectedItem = nextLine.CONNECTORS[0].CONNECTEDITEM });
576
                }
577
            }
578
        }
579

    
580
        private void CalibratePointInfos(List<PointInfo> pointInfos, List<Line> lines)
581
        {
582
            // 맨 앞이 Symbol일 경우
583
            if (pointInfos[0].ConnectedItemObject != null && typeof(Symbol) == pointInfos[0].ConnectedItemObject.GetType())
584
            {
585
                PointInfo startPoint = pointInfos[0];
586
                PointInfo nextPoint = pointInfos[1];
587

    
588
                Symbol symbol = startPoint.ConnectedItemObject as Symbol;
589
                LMSymbol _LMSymbol = symbol.SPPID_ITEM_OBJECT as LMSymbol;
590
                double symbolX = _LMSymbol.get_XCoordinate();
591
                double symbolY = _LMSymbol.get_YCoordinate();
592

    
593
                if (lines[0].SLOPTYPE == Line.SlopeType.HORIZONTAL)
594
                {
595
                    startPoint.Y = symbolY;
596
                    nextPoint.Y = symbolY;
597
                }
598
                else if (lines[0].SLOPTYPE == Line.SlopeType.VERTICAL)
599
                {
600
                    startPoint.X = symbolX;
601
                    nextPoint.X = symbolX;
602
                }
603
            }
604
            // 맨 뒤가 Symbol일 경우
605
            else if (pointInfos[pointInfos.Count - 1].ConnectedItemObject != null && typeof(Symbol) == pointInfos[pointInfos.Count - 1].ConnectedItemObject.GetType())
606
            {
607
                PointInfo startPoint = pointInfos[pointInfos.Count - 1];
608
                PointInfo nextPoint = pointInfos[pointInfos.Count - 2];
609

    
610
                Symbol symbol = startPoint.ConnectedItemObject as Symbol;
611
                LMSymbol _LMSymbol = symbol.SPPID_ITEM_OBJECT as LMSymbol;
612
                double symbolX = _LMSymbol.get_XCoordinate();
613
                double symbolY = _LMSymbol.get_YCoordinate();
614

    
615
                if (lines[lines.Count - 1].SLOPTYPE == Line.SlopeType.HORIZONTAL)
616
                {
617
                    startPoint.Y = symbolY;
618
                    nextPoint.Y = symbolY;
619
                }
620
                else if (lines[lines.Count - 1].SLOPTYPE == Line.SlopeType.VERTICAL)
621
                {
622
                    startPoint.X = symbolX;
623
                    nextPoint.X = symbolX;
624
                }
625
            }
626
        }
627

    
628
        private Tuple<LMConnector, int> GetTargetLMConnector(PointInfo pointInfo)
629
        {
630
            LMConnector lMConnector = null;
631
            int insertIndex = 0;
632
            try
633
            {
634
                Line line = pointInfo.ConnectedItemObject as Line;
635
                if (line.SPPID_ITEM_OBJECT == null)
636
                    return null;
637

    
638
                string modelId = line.SPPID_ITEM_OBJECT.ToString();
639
                List<PointInfo> pointInfos = document.PipeRunPoint[modelId];
640
                double distance = double.MaxValue;
641

    
642
                PointInfo point1 = new PointInfo(0, 0);
643
                PointInfo point2 = new PointInfo(0, 0);
644

    
645
                for (int i = 0; i < pointInfos.Count - 1; i++)
646
                {
647
                    PointInfo tempPoint1 = pointInfos[i];
648
                    PointInfo tempPoint2 = pointInfos[i + 1];
649

    
650
                    double tempDistance = double.MaxValue;
651

    
652
                    Line.SlopeType slopeType = SPPIDUtill.CalcSlop(tempPoint1, tempPoint2);
653
                    if (slopeType == Line.SlopeType.HORIZONTAL)
654
                    {
655
                        double min = Math.Min(tempPoint1.X, tempPoint2.X);
656
                        double max = Math.Max(tempPoint1.X, tempPoint2.X);
657

    
658
                        if (min <= pointInfo.X && max >= pointInfo.X)
659
                            tempDistance = SPPIDUtill.CalcLineToPointDistance(tempPoint1, tempPoint2, pointInfo);
660
                    }
661
                    else if (slopeType == Line.SlopeType.VERTICAL)
662
                    {
663
                        double min = Math.Min(tempPoint1.Y, tempPoint2.Y);
664
                        double max = Math.Max(tempPoint1.Y, tempPoint2.Y);
665

    
666
                        if (min <= pointInfo.Y && max >= pointInfo.Y)
667
                            tempDistance = SPPIDUtill.CalcLineToPointDistance(tempPoint1, tempPoint2, pointInfo);
668
                    }
669
                    else
670
                    {
671
                        tempDistance = SPPIDUtill.CalcLineToPointDistance(tempPoint1, tempPoint2, pointInfo);
672
                    }
673

    
674
                    if (tempDistance < distance)
675
                    {
676
                        insertIndex = i + 1;
677
                        distance = tempDistance;
678
                        point1 = tempPoint1;
679
                        point2 = tempPoint2;
680
                    }
681
                }
682

    
683
                if (point1.Type == PointInfo.PointType.Run)
684
                    lMConnector = GetLMConnectorByPoint(modelId, point1);
685
                else if (point2.Type == PointInfo.PointType.Run)
686
                    lMConnector = GetLMConnectorByPoint(modelId, point2);
687
                else
688
                    lMConnector = GetLMConnectorBySP_ID(modelId, point1.SP_ID, point2.SP_ID);
689
            }
690
            catch (Exception ex)
691
            {
692
                Log.WriteLine(ex);
693
                return null;
694
            }
695

    
696
            if (lMConnector == null)
697
                return null;
698
            else
699
                return new Tuple<LMConnector, int>(lMConnector, insertIndex);
700
        }
701

    
702
        private LMConnector GetLMConnectorByPoint(string modelId, PointInfo pointInfo)
703
        {
704
            LMConnector lMConnector = null;
705
            
706
            try
707
            {
708
                Placement _placement = new Placement();
709
                double distance = double.MaxValue;
710
                LMPipeRun lMPipeRun = _placement.PIDDataSource.GetPipeRun(modelId);
711
                if (lMPipeRun != null)
712
                {
713
                    foreach (LMRepresentation rep in lMPipeRun.Representations)
714
                    {
715
                        if (rep.Attributes["RepresentationType"].get_Value() == "Connector" && rep.Attributes["ItemStatus"].get_Value() == "Active")
716
                        {
717
                            LMConnector _tempLMConnector = _placement.PIDDataSource.GetConnector(rep.Id);
718
                            foreach (LMConnectorVertex vertex in _tempLMConnector.ConnectorVertices)
719
                            {
720
                                double tempDistance = SPPIDUtill.CalcPointToPointdDistance(pointInfo, new PointInfo(vertex.get_XCoordinate(), vertex.get_YCoordinate()));
721

    
722
                                if (tempDistance < distance)
723
                                {
724
                                    distance = tempDistance;
725
                                    lMConnector = _tempLMConnector;
726
                                }
727
                            }
728

    
729
                        }
730
                    }
731
                }
732
            }
733
            catch (Exception ex)
734
            {
735
                Log.WriteLine(ex);
736
            }
737
            
738
            
739
            return lMConnector;
740
        }
741

    
742
        private LMConnector GetLMConnectorBySP_ID(string modelId, string SP_ID1, string SP_ID2)
743
        {
744
            Placement _placement = new Placement();
745

    
746
            LMPipeRun lMPipeRun = _placement.PIDDataSource.GetPipeRun(modelId);
747
            foreach (LMRepresentation rep in lMPipeRun.Representations)
748
            {
749
                if (rep.Attributes["RepresentationType"].get_Value() == "Connector" && rep.Attributes["ItemStatus"].get_Value() == "Active")
750
                {
751
                    LMConnector _tempLMConnector = _placement.PIDDataSource.GetConnector(rep.Id);
752

    
753
                    bool find1 = false;
754
                    bool find2 = false;
755

    
756
                    if (_tempLMConnector.ConnectItem1SymbolID != null && !DBNull.Value.Equals(_tempLMConnector.ConnectItem1SymbolID))
757
                    {
758
                        string connId = _tempLMConnector.ConnectItem1SymbolID;
759
                        if (connId == SP_ID1 || connId == SP_ID2)
760
                            find1 = true;
761
                    }
762

    
763
                    if (_tempLMConnector.ConnectItem2SymbolID != null && !DBNull.Value.Equals(_tempLMConnector.ConnectItem2SymbolID))
764
                    {
765
                        string connId = _tempLMConnector.ConnectItem2SymbolID;
766
                        if (connId == SP_ID1 || connId == SP_ID2)
767
                            find2 = true;
768
                    }
769

    
770

    
771
                    if (find1 && find2)
772
                    {
773
                        return _tempLMConnector;
774
                    }
775
                }
776
            }
777
            return null;
778
        }
779

    
780
        #endregion
781

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