프로젝트

일반

사용자정보

통계
| 개정판:

hytos / ID2.Manager / ID2.Manager.Compare / Controls / Verification.cs @ 353b7f9f

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

1
using devDept.Eyeshot;
2
using devDept.Eyeshot.Entities;
3
using devDept.Eyeshot.Translators;
4
using devDept.Geometry.Entities;
5
using System;
6
using System.Collections.Generic;
7
using System.ComponentModel;
8
using System.Data;
9
using System.Drawing;
10
using System.IO;
11
using System.Linq;
12
using System.Runtime.InteropServices;
13
using System.Text;
14
using System.Threading.Tasks;
15
using System.Windows.Forms;
16
using Telerik.WinControls;
17
using Telerik.WinControls.UI;
18
using Telerik.Windows.Documents.Fixed.FormatProviders.Pdf;
19
using Telerik.Windows.Documents.Fixed.Model;
20
using Telerik.Windows.Documents.Fixed.Model.Editing;
21

    
22
namespace ID2.Manager.Controls
23
{
24
    public partial class Verification : UserControl
25
    {
26
        readonly string IniFilePath = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), 
27
            Application.ProductName, $"{Application.ProductName}.ini");
28

    
29
        #region 기본값
30
        private static string AutoCADLayer { get; } = "AutoCAD";
31
        private static string AutoCADDiffLayer { get; } = "AutoCAD_Diff";
32
        private static string AutoCADExceptLayer { get; } = "AutoCAD_Except";
33
        private static Color AutoCADColor = Color.FromArgb(44, 44, 44);
34
        private static string AVEVALayer { get; } = "AVEVA";
35
        private static string AVEVADiffLayer { get; } = "AVEVA_Diff";
36
        private static string AVEVAExceptLayer { get; } = "AVEVA_Except";
37
        private static Color AVEVAColor = Color.FromArgb(44, 44, 44);
38
        private static string RevCloudLayer { get; } = "RevCloud";
39
        private static Color RevCloudColor = Color.Magenta;
40
        private static Color DiffColor = Color.Yellow;
41
        
42
        private static double Tolerance = 0;
43
        private static double LengthToleranceRatio { get; set; } = 0.1;
44
        private static bool Casesensitive { get; set; } = false;
45
        #endregion
46

    
47
        private RadProgressBarElement _progressBar = null;
48

    
49
        public Verification(RadProgressBarElement progressBar)
50
        {
51
            InitializeComponent();
52

    
53
            this.Load += Verification_Load;
54
            this.radSpinEditorTolerance.ValueChanged += RadSpinEditorTolerance_ValueChanged;
55
            this.radColorBoxAutoCADColor.ValueChanged += RadColorBoxAutoCADColor_ValueChanged;
56
            this.radColorBoxAVEVAColor.ValueChanged += RadColorBoxAVEVAColor_ValueChanged;
57
            this.radColorBoxDiffColor.ValueChanged += RadColorBoxDiffColor_ValueChanged;
58
            this.radColorBoxRevCloudColor.ValueChanged += RadColorBoxRevCloudColor_ValueChanged;
59

    
60
            this.designAutoCAD.ActionMode = actionType.SelectVisibleByPickDynamic;
61
            this.designAutoCAD.ActiveViewport.CoordinateSystemIcon.Visible = false;
62
            this.designAutoCAD.Selection.ColorDynamic = Color.FromArgb(80, Color.OrangeRed);
63
            this.designAutoCAD.Selection.HaloInnerColor = Color.FromArgb(255, Color.OrangeRed);
64
            this.designAutoCAD.Selection.HaloOuterColor = Color.FromArgb(64, Color.OrangeRed);
65
            this.designAutoCAD.Selection.HaloWidthPolygons = 4;
66
            this.designAutoCAD.Selection.HaloWidthWires = 2;
67
            this.designAutoCAD.ActiveViewport.OriginSymbol.Visible = false;
68
            this.designAutoCAD.SetView(viewType.Trimetric);
69

    
70
            this.designAVEVA.ActionMode = actionType.SelectVisibleByPickDynamic;
71
            this.designAVEVA.ActiveViewport.CoordinateSystemIcon.Visible = false;
72
            this.designAVEVA.ActiveViewport.OriginSymbol.Visible = false;
73
            this.designCompare.ActionMode = actionType.SelectVisibleByPickDynamic;
74
            this.designCompare.ActiveViewport.CoordinateSystemIcon.Visible = false;
75
            this.designCompare.ActiveViewport.OriginSymbol.Visible = false;
76

    
77
            this.radCheckedDropDownListAutoCAD.ItemCheckedChanged += RadCheckedDropDownListAutoCAD_ItemCheckedChanged;
78
            this.radCheckedDropDownListAVEVA.ItemCheckedChanged += RadCheckedDropDownListAVEVA_ItemCheckedChanged;
79
            this.radCheckBoxRevCloud.CheckStateChanged += RadCheckBoxRevCloud_CheckStateChanged;
80
            this.radToggleSwitchCasesensitive.ValueChanged += RadToggleSwitchCasesensitive_ValueChanged;
81

    
82
            _progressBar = progressBar;
83

    
84
            #region Camera Sync
85
            this.designAutoCAD.ActiveViewport.Rotate.Enabled = false;
86
            this.designAVEVA.ActiveViewport.Rotate.Enabled = false;
87
            this.designCompare.ActiveViewport.Rotate.Enabled = false;
88

    
89
            this.designAutoCAD.ActiveViewport.ViewCubeIcon.Visible = false;
90
            this.designAVEVA.ActiveViewport.ViewCubeIcon.Visible = false;
91
            this.designCompare.ActiveViewport.ViewCubeIcon.Visible = false;
92

    
93
            this.designAutoCAD.AnimateCamera = false;
94
            this.designAVEVA.AnimateCamera = false;
95
            this.designCompare.AnimateCamera = false;
96

    
97
            this.designAutoCAD.CameraChangedFrequency = 200;
98
            this.designAVEVA.CameraChangedFrequency = 200;
99
            this.designCompare.CameraChangedFrequency = 200;
100

    
101
            this.designAutoCAD.CameraChanged += CameraChanged;
102
            this.designAVEVA.CameraChanged += CameraChanged;
103
            this.designCompare.CameraChanged += CameraChanged;
104
            #endregion
105
        }
106

    
107
        private void RadToggleSwitchCasesensitive_ValueChanged(object sender, EventArgs e)
108
        {
109
            bool value = this.radToggleSwitchCasesensitive.Value;
110
            Verification.Casesensitive = value;
111
            Classes.ID2Helper.IniWriteValue(IniFilePath, "Verification", "Casesensitive", value.ToString());
112
        }
113

    
114
        private void RadCheckedDropDownListAVEVA_ItemCheckedChanged(object sender, RadCheckedListDataItemEventArgs e)
115
        {
116
            var layer = this.designCompare.Layers.FirstOrDefault(x => x.Name.ToUpper() == e.Item.Text.ToUpper());
117
            if (layer != null) layer.Visible = e.Item.Checked;
118
            this.designCompare.Invalidate();
119

    
120
            Classes.ID2Helper.IniWriteValue(IniFilePath, "Verification", e.Item.Text, e.Item.Checked.ToString());
121
        }
122

    
123
        private void RadCheckedDropDownListAutoCAD_ItemCheckedChanged(object sender, RadCheckedListDataItemEventArgs e)
124
        {
125
            var layer = this.designCompare.Layers.FirstOrDefault(x => x.Name.ToUpper() == e.Item.Text.ToUpper());
126
            if (layer != null) layer.Visible = e.Item.Checked;
127
            this.designCompare.Invalidate();
128

    
129
            Classes.ID2Helper.IniWriteValue(IniFilePath, "Verification", e.Item.Text, e.Item.Checked.ToString());
130
        }
131

    
132
        private void RadCheckBoxRevCloud_CheckStateChanged(object sender, EventArgs e)
133
        {
134
            var layer = this.designCompare.Layers.FirstOrDefault(x => x.Name.ToUpper() == Verification.RevCloudLayer.ToUpper());
135
            if (layer != null) layer.Visible = (sender as RadCheckBox).Checked;
136
            this.designCompare.Invalidate();
137
        }
138

    
139
        private void RadCheckBoxAVEVA_CheckStateChanged(object sender, EventArgs e)
140
        {
141
            var layer = this.designCompare.Layers.FirstOrDefault(x => x.Name.ToUpper() == Verification.AVEVALayer.ToUpper());
142
            if (layer != null) layer.Visible = (sender as RadCheckBox).Checked;
143
            this.designCompare.Invalidate();
144
        }
145

    
146
        /// <summary>
147
        /// Cloud Mark의 색상을 설정한다.
148
        /// </summary>
149
        /// <param name="sender"></param>
150
        /// <param name="e"></param>
151
        private void RadColorBoxRevCloudColor_ValueChanged(object sender, EventArgs e)
152
        {
153
            Verification.RevCloudColor = this.radColorBoxRevCloudColor.Value;
154
            string color = $"{Verification.RevCloudColor.R},{Verification.RevCloudColor.G},{Verification.RevCloudColor.B}";
155
            Classes.ID2Helper.IniWriteValue(IniFilePath, "Verification", "RevCloudColor", color);
156
        }
157

    
158
        /// <summary>
159
        /// 두 도면을 비교하여 결과를 PDF로 출력한다.
160
        /// </summary>
161
        /// <param name="sender"></param>
162
        /// <param name="e"></param>
163
        public void CompareDrawings(IList<Document> docs, bool Save = false)
164
        {
165
            string FileFolder = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), 
166
                Application.ProductName, "Compare");
167
            if (!System.IO.Directory.Exists(FileFolder)) System.IO.Directory.CreateDirectory(FileFolder);
168

    
169
            try
170
            {
171
                Size? size = new Size();
172
                RadFixedDocument FixedDoc = null;
173
                if (Save)
174
                {
175
                    size = new Size(1920 * 2, 1080 * 2);
176
                    FixedDoc = new RadFixedDocument();
177

    
178
                    designCompare.ActiveViewport.Background.BottomColor = Color.White;
179
                    designCompare.ActiveViewport.Background.TopColor = Color.White;
180
                }
181

    
182
                _progressBar.Maximum = docs.Count();
183
                _progressBar.Value1 = 0;
184
                foreach (var doc in docs)
185
                {
186
                    _progressBar.Text = doc.DocumentNo;
187
                    CompareDrawing(doc, Save);
188

    
189
                    if (Save)
190
                    {
191
                        using (var bmp = this.designCompare.RenderToBitmap(size.Value))
192
                        {
193
                            string FilePath = System.IO.Path.Combine(FileFolder, $"{doc.DocumentNo}.jpg");
194
                            bmp.Save(FilePath, System.Drawing.Imaging.ImageFormat.Jpeg);
195

    
196
                            var page = FixedDoc.Pages.AddPage();
197
                            page.Size = new Telerik.Documents.Primitives.Size(size.Value.Width, size.Value.Height);
198
                            var editor = new FixedContentEditor(page);
199
                            using (FileStream fs = new FileStream(FilePath, FileMode.Open))
200
                            {
201
                                editor.DrawImage(fs);
202
                            }
203
                        }
204
                    }
205

    
206
                    _progressBar.Value1 += 1;
207
                    Application.DoEvents();
208
                }
209

    
210
                if (Save)
211
                {
212
                    RadSaveFileDialog saveFileDialog = new RadSaveFileDialog()
213
                    {
214
                        Filter = "PDF files (*.pdf)|*.pdf",
215
                        RestoreDirectory = true
216
                    };
217
                    if (System.Windows.Forms.DialogResult.OK == saveFileDialog.ShowDialog())
218
                    {
219
                        string selectedFileName = saveFileDialog.FileName;
220

    
221
                        // If you are working in a .NET Core application, you will need to also provide an image resolver. You can use the default implementation provided in Telerik.Documents.ImageUtils: 
222
                        Telerik.Documents.ImageUtils.ImagePropertiesResolver defaultImagePropertiesResolver = new Telerik.Documents.ImageUtils.ImagePropertiesResolver();
223
                        Telerik.Windows.Documents.Extensibility.FixedExtensibilityManager.ImagePropertiesResolver = defaultImagePropertiesResolver;
224

    
225
                        var provider = new PdfFormatProvider();
226
                        File.WriteAllBytes(selectedFileName, provider.Export(FixedDoc));
227

    
228
                        RadMessageBox.Show("Comparing document is done");
229
                    }
230
                }
231
            }
232
            catch(Exception ex)
233
            {
234
                RadMessageBox.Show(ex.Message);
235
            }
236
            finally
237
            {
238
                designCompare.ActiveViewport.Background.BottomColor = Color.Black;
239
                designCompare.ActiveViewport.Background.TopColor = Color.Black;
240
            }
241
        }
242

    
243
        /// <summary>
244
        /// 서로 다른 엔터티의 색상을 설정한다.
245
        /// </summary>
246
        /// <param name="sender"></param>
247
        /// <param name="e"></param>
248
        private void RadColorBoxDiffColor_ValueChanged(object sender, EventArgs e)
249
        {
250
            Verification.DiffColor = this.radColorBoxDiffColor.Value;
251
            string color = $"{Verification.DiffColor.R},{Verification.DiffColor.G},{Verification.DiffColor.B}";
252
            Classes.ID2Helper.IniWriteValue(IniFilePath, "Verification", "DiffColor", color);
253
        }
254

    
255
        /// <summary>
256
        /// AutoCAD 엔터티의 색상을 설정한다.
257
        /// </summary>
258
        /// <param name="sender"></param>
259
        /// <param name="e"></param>
260
        private void RadColorBoxAutoCADColor_ValueChanged(object sender, EventArgs e)
261
        {
262
            Verification.AutoCADColor = this.radColorBoxAutoCADColor.Value;
263
            string color = $"{Verification.AutoCADColor.R},{Verification.AutoCADColor.G},{Verification.AutoCADColor.B}";
264
            Classes.ID2Helper.IniWriteValue(IniFilePath, "Verification", "AutoCADColor", color);
265
        }
266

    
267
        /// <summary>
268
        /// AVEVA 엔터티의 색상을 설정한다.
269
        /// </summary>
270
        /// <param name="sender"></param>
271
        /// <param name="e"></param>
272
        private void RadColorBoxAVEVAColor_ValueChanged(object sender, EventArgs e)
273
        {
274
            Verification.AVEVAColor = this.radColorBoxAVEVAColor.Value;
275
            string color = $"{Verification.AVEVAColor.R},{Verification.AVEVAColor.G},{Verification.AVEVAColor.B}";
276
            Classes.ID2Helper.IniWriteValue(IniFilePath, "Verification", "AVEVAColor", color);
277
        }
278

    
279
        /// <summary>
280
        /// 수정한 Tolerance를 시스템에 반영한다.
281
        /// </summary>
282
        /// <param name="sender"></param>
283
        /// <param name="e"></param>
284
        private void RadSpinEditorTolerance_ValueChanged(object sender, EventArgs e)
285
        {
286
            double toler = Convert.ToDouble(this.radSpinEditorTolerance.Value);
287
            Classes.ID2Helper.IniWriteValue(IniFilePath, "Verification", "Tolerance", toler.ToString());
288
            Verification.Tolerance = toler;
289
        }
290

    
291
        private void Verification_Load(object sender, EventArgs e)
292
        {
293
            string Toler = Classes.ID2Helper.IniReadValue(IniFilePath, "Verification", "Tolerance");
294
            if (!string.IsNullOrEmpty(Toler))
295
            {
296
                this.radSpinEditorTolerance.Value = Convert.ToDecimal(Toler);
297
                Verification.Tolerance = Convert.ToDouble(this.radSpinEditorTolerance.Value);
298
            }
299

    
300
            string _AutoCADLayer = Classes.ID2Helper.IniReadValue(IniFilePath, "Verification", Verification.AutoCADLayer);
301
            if (!string.IsNullOrEmpty(_AutoCADLayer))
302
            {
303
                bool Checked = Convert.ToBoolean(_AutoCADLayer);
304
                var item = this.radCheckedDropDownListAutoCAD.Items.FirstOrDefault(x => x.Text == Verification.AutoCADLayer);
305
                if (item is RadCheckedListDataItem CheckedItem) CheckedItem.Checked = Checked; 
306
            }
307

    
308
            string _AutoCADDiffLayer = Classes.ID2Helper.IniReadValue(IniFilePath, "Verification", Verification.AutoCADDiffLayer);
309
            if (!string.IsNullOrEmpty(_AutoCADDiffLayer))
310
            {
311
                bool Checked = Convert.ToBoolean(_AutoCADDiffLayer);
312
                var item = this.radCheckedDropDownListAutoCAD.Items.FirstOrDefault(x => x.Text == Verification.AutoCADDiffLayer);
313
                if (item is RadCheckedListDataItem CheckedItem) CheckedItem.Checked = Checked;
314
            }
315

    
316
            string _AutoCADColor = Classes.ID2Helper.IniReadValue(IniFilePath, "Verification", "AutoCADColor");
317
            if (!string.IsNullOrEmpty(_AutoCADColor))
318
            {
319
                var tokens = _AutoCADColor.Split(',');
320
                if (tokens.Length == 3)
321
                {
322
                    this.radColorBoxAutoCADColor.Value =
323
                         Color.FromArgb(Convert.ToInt32(tokens[0]), Convert.ToInt32(tokens[1]), Convert.ToInt32(tokens[2]));
324
                }
325
            }
326

    
327
            string _AVEVALayer = Classes.ID2Helper.IniReadValue(IniFilePath, "Verification", Verification.AVEVALayer);
328
            if (!string.IsNullOrEmpty(_AutoCADLayer))
329
            {
330
                bool Checked = Convert.ToBoolean(_AVEVALayer);
331
                var item = this.radCheckedDropDownListAVEVA.Items.FirstOrDefault(x => x.Text == Verification.AVEVALayer);
332
                if (item is RadCheckedListDataItem CheckedItem) CheckedItem.Checked = Checked;
333
            }
334

    
335
            string _AVEVADiffLayer = Classes.ID2Helper.IniReadValue(IniFilePath, "Verification", Verification.AVEVADiffLayer);
336
            if (!string.IsNullOrEmpty(_AVEVADiffLayer))
337
            {
338
                bool Checked = Convert.ToBoolean(_AVEVADiffLayer);
339
                var item = this.radCheckedDropDownListAVEVA.Items.FirstOrDefault(x => x.Text == Verification.AVEVADiffLayer);
340
                if (item is RadCheckedListDataItem CheckedItem) CheckedItem.Checked = Checked;
341
            }
342

    
343
            string _AVEVAColor = Classes.ID2Helper.IniReadValue(IniFilePath, "Verification", "AVEVAColor");
344
            if (!string.IsNullOrEmpty(_AVEVAColor))
345
            {
346
                var tokens = _AVEVAColor.Split(',');
347
                if (tokens.Length == 3)
348
                {
349
                    this.radColorBoxAVEVAColor.Value =
350
                        Color.FromArgb(Convert.ToInt32(tokens[0]), Convert.ToInt32(tokens[1]), Convert.ToInt32(tokens[2]));
351
                }
352
            }
353

    
354
            string _DiffColor = Classes.ID2Helper.IniReadValue(IniFilePath, "Verification", "DiffColor");
355
            if (!string.IsNullOrEmpty(_DiffColor))
356
            {
357
                var tokens = _DiffColor.Split(',');
358
                if (tokens.Length == 3)
359
                {
360
                    this.radColorBoxDiffColor.Value =
361
                        Color.FromArgb(Convert.ToInt32(tokens[0]), Convert.ToInt32(tokens[1]), Convert.ToInt32(tokens[2]));
362
                }
363
            }
364

    
365
            string _RevCloudColor = Classes.ID2Helper.IniReadValue(IniFilePath, "Verification", "RevCloudColor");
366
            if (!string.IsNullOrEmpty(_RevCloudColor))
367
            {
368
                var tokens = _RevCloudColor.Split(',');
369
                if (tokens.Length == 3)
370
                {
371
                    this.radColorBoxRevCloudColor.Value =
372
                        Color.FromArgb(Convert.ToInt32(tokens[0]), Convert.ToInt32(tokens[1]), Convert.ToInt32(tokens[2]));
373
                }
374
            }
375

    
376
            string _LengthToleranceRatio = Classes.ID2Helper.IniReadValue(IniFilePath, "Verification", "Length Tolerance Ratio");
377
            if (!string.IsNullOrEmpty(_LengthToleranceRatio))
378
            {
379
                LengthToleranceRatio = Convert.ToDouble(_LengthToleranceRatio);
380
            }
381

    
382
            string _ArrowMaxLength = Classes.ID2Helper.IniReadValue(IniFilePath, "Verification", "Arrow Max Length");
383
            if (!string.IsNullOrEmpty(_ArrowMaxLength))
384
            {
385
                Forms.ExceptLayer.ArrowMaxLength = Convert.ToDouble(_ArrowMaxLength);
386
            }
387

    
388
            string _SpecialCharacters = Classes.ID2Helper.IniReadValue(IniFilePath, "Verification", "SpecialCharacters");
389
            if (!string.IsNullOrEmpty(_SpecialCharacters))
390
            {
391
                var tokens = _SpecialCharacters.Split(',').ToList();
392
                Forms.ExceptLayer.SpecialCharacters.AddRange(tokens.ConvertAll(x =>
393
                {
394
                    var characters = x.Split('=');
395
                    return new Forms.ExceptLayer.SpecialCharacter(characters[0], characters[1]);
396
                }));
397
            }
398

    
399
            string _Casesensitive = Classes.ID2Helper.IniReadValue(IniFilePath, "Verification", "Casesensitive");
400
            if (!string.IsNullOrEmpty(_Casesensitive))
401
            {
402
                Casesensitive = Convert.ToBoolean(_Casesensitive);
403
            }
404

    
405
            #region Except Layer를 로딩한다.
406
            LoadLayerSettings();
407
            #endregion
408

    
409
            this.designCompare.WorkCompleted += DesignCompare_WorkCompleted;
410
        }
411

    
412
        private void ApplyLayers()
413
        {
414
            var others = this.designCompare.Entities.Where(x =>
415
            {
416
                return (x.LayerName != Verification.AVEVALayer && x.LayerName != Verification.AVEVADiffLayer &&
417
                x.LayerName != Verification.AutoCADLayer && x.LayerName != Verification.AutoCADDiffLayer &&
418
                x.LayerName != Verification.RevCloudLayer);
419
            }).ToList();
420

    
421
            others.ForEach(x =>
422
            {
423
                if (x.LayerName == Verification.AutoCADExceptLayer)
424
                    x.LayerName = Verification.AutoCADLayer;
425
                else if (x.LayerName == Verification.AVEVAExceptLayer)
426
                    x.LayerName = Verification.AVEVALayer;
427
            });
428

    
429
            #region 레이어 설정 적용
430
            var layer = this.designCompare.Layers.FirstOrDefault(x => x.Name.ToUpper() == Verification.RevCloudLayer.ToUpper());
431
            if (layer != null) layer.Visible = this.radCheckBoxRevCloud.Checked;
432

    
433
            layer = this.designCompare.Layers.FirstOrDefault(x => x.Name.ToUpper() == Verification.AVEVALayer.ToUpper());
434
            if (layer != null)
435
            {
436
                var item = this.radCheckedDropDownListAVEVA.Items.FirstOrDefault(x => x.Text.ToUpper() == Verification.AVEVALayer.ToUpper());
437
                if (item is RadCheckedListDataItem CheckedItem) layer.Visible = CheckedItem.Checked;
438
            }
439

    
440
            layer = this.designCompare.Layers.FirstOrDefault(x => x.Name.ToUpper() == Verification.AVEVADiffLayer.ToUpper());
441
            if (layer != null)
442
            {
443
                var item = this.radCheckedDropDownListAVEVA.Items.FirstOrDefault(x => x.Text.ToUpper() == Verification.AVEVADiffLayer.ToUpper());
444
                if (item is RadCheckedListDataItem CheckedItem) layer.Visible = CheckedItem.Checked;
445
            }
446

    
447
            layer = this.designCompare.Layers.FirstOrDefault(x => x.Name.ToUpper() == Verification.AutoCADLayer.ToUpper());
448
            if (layer != null)
449
            {
450
                var item = this.radCheckedDropDownListAutoCAD.Items.FirstOrDefault(x => x.Text.ToUpper() == Verification.AutoCADLayer.ToUpper());
451
                if (item is RadCheckedListDataItem CheckedItem) layer.Visible = CheckedItem.Checked;
452
            }
453

    
454
            layer = this.designCompare.Layers.FirstOrDefault(x => x.Name.ToUpper() == Verification.AutoCADDiffLayer.ToUpper());
455
            if (layer != null)
456
            {
457
                var item = this.radCheckedDropDownListAutoCAD.Items.FirstOrDefault(x => x.Text.ToUpper() == Verification.AutoCADDiffLayer.ToUpper());
458
                if (item is RadCheckedListDataItem CheckedItem) layer.Visible = CheckedItem.Checked;
459
            }
460
            #endregion
461
        }
462

    
463
        private void DesignCompare_WorkCompleted(object sender, devDept.WorkCompletedEventArgs e)
464
        {
465
            if(e.WorkUnit is Classes.CompareModelWorkUnit workunit)
466
            {
467
                ApplyLayers();    
468
                this.designCompare.Invalidate();
469
            }
470
        }
471

    
472
        /// <summary>
473
        /// 레이어 설정을 읽는다.
474
        /// </summary>
475
        public void LoadLayerSettings()
476
        {
477
            Forms.ExceptLayer.ExceptLayers.Clear();
478
            Forms.ExceptLayer.LineLayers.Clear();
479

    
480
            string _ExceptLayers = Classes.ID2Helper.IniReadValue(IniFilePath, "Verification", "Except Layers");
481
            if (!string.IsNullOrEmpty(_ExceptLayers))
482
            {
483
                Forms.ExceptLayer.ExceptLayers.AddRange(_ExceptLayers.Split(',').ToList().ConvertAll(x => new Forms.ExceptLayer.Layer(x)));
484

    
485
                string _ExceptLayersVisible = Classes.ID2Helper.IniReadValue(IniFilePath, "Verification", "Except Layers Visible");
486
                if (!string.IsNullOrEmpty(_ExceptLayersVisible))
487
                {
488
                    var tokens = _ExceptLayersVisible.Split(',').ToList().ConvertAll(x => Convert.ToBoolean(x));
489
                    for (int i = 0; i < Forms.ExceptLayer.ExceptLayers.Count; ++i)
490
                    {
491
                        if (i < tokens.Count)
492
                        {
493
                            Forms.ExceptLayer.ExceptLayers[i].Visible = tokens[i];
494
                        }
495
                    }
496
                }
497
            }
498

    
499
            string _LineLayers = Classes.ID2Helper.IniReadValue(IniFilePath, "Verification", "Line Layers");
500
            if (!string.IsNullOrEmpty(_LineLayers))
501
            {
502
                Forms.ExceptLayer.LineLayers.AddRange(_LineLayers.Split(',').ToList().ConvertAll(x => new Forms.ExceptLayer.Layer(x)));
503
            }
504
        }
505

    
506
        /// <summary>
507
        /// 엔터티들의 색상을 바꾼다.
508
        /// </summary>
509
        /// <param name="design"></param>
510
        /// <param name="list"></param>
511
        public void ColorEntities(Design design, IList<Entity> list, Color color, colorMethodType colorMethod=colorMethodType.byEntity, bool ChangeBlkColor=true)
512
        {
513
            foreach (Entity ent in list)
514
            {
515
                ColorEntity(design, ent, color, colorMethod, ChangeBlkColor);
516
            }
517
        }
518

    
519
        /// <summary>
520
        /// 엔터티의 색상을 변경한다.
521
        /// </summary>
522
        /// <param name="design"></param>
523
        /// <param name="entity"></param>
524
        /// <param name="color"></param>
525
        private void ColorEntity(Design design, Entity entity, Color color, colorMethodType colorMethod = colorMethodType.byEntity, 
526
            bool ChangeBlkColor = true)
527
        {
528
            if (entity is BlockReference blkref)
529
            {
530
                blkref.Color = color;
531
                blkref.ColorMethod = colorMethod;
532

    
533
                if (ChangeBlkColor)
534
                {
535
                    var blk = design.Blocks.FirstOrDefault(x => x.Name == blkref.BlockName);
536
                    if (blk != null)
537
                    {
538
                        ColorEntities(design, blk.Entities, color, colorMethodType.byParent);
539
                        foreach (var attr in blkref.Attributes.Values)
540
                        {
541
                            attr.Color = color;
542
                            attr.ColorMethod = colorMethodType.byParent;
543
                        }
544
                    }
545
                }
546
            }
547
            else
548
            {
549
                entity.Color = color;
550
                entity.ColorMethod = colorMethod;
551
            }
552
        }
553

    
554
        /// <summary>
555
        /// 블럭 참조를 깨어 블럭의 구성 요소들을 리트스트 리턴한다.
556
        /// </summary>
557
        /// <param name="design"></param>
558
        /// <param name="blkref"></param>
559
        /// <param name="LayerName"></param>
560
        /// <param name="color"></param>
561
        /// <returns></returns>
562
        private List<Entity> ExplodeBlockReference(BlockKeyedCollection Blocks, BlockReference blkref, string LayerName, Color color)
563
        {
564
            var res = new List<Entity>();
565

    
566
            try
567
            {
568
                var entities = blkref.Explode(Blocks);
569
                entities.ToList().ForEach(y =>
570
                {
571
                #region 블럭 이름이 ARROW로 시작되는 경우 Hatch로 화살표를 그려준다.
572
                if (y is LinearPath arrow && arrow.Vertices.Length == 2 && blkref.BlockName.StartsWith("ARROW"))
573
                    {
574
                        double weight = arrow.LineWeight * blkref.GetScaleFactorY();
575
                        var dir = new devDept.Geometry.Vector3D(arrow.Vertices[0], arrow.Vertices[1]);
576
                        dir.Normalize();
577
                        var cross = devDept.Geometry.Vector3D.Cross(devDept.Geometry.Vector3D.AxisZ, dir);
578
                        var pts = new devDept.Geometry.Point3D[]
579
                        {
580
                        arrow.Vertices[1] + cross * weight * 0.5,
581
                        arrow.Vertices[0],
582
                        arrow.Vertices[1] - cross * weight * 0.5
583
                        };
584

    
585
                        var hatch = new Hatch("SOLID", new List<ICurve>() { new LinearPath(pts) });
586
                        res.Add(hatch);
587
                    }
588
                #endregion
589
                else if (y is LinearPath lp)
590
                    {
591
                        int count = Convert.ToInt32(lp.Vertices.Length);
592
                        for (int i = 0; i < count - 1; ++i)
593
                        {
594
                            var line = new devDept.Eyeshot.Entities.Line(lp.Vertices[i], lp.Vertices[i + 1])
595
                            {
596
                                LayerName = lp.LayerName,
597
                                LineWeight = lp.LineWeight,
598
                                LineTypeMethod = colorMethodType.byEntity,
599
                                Color = lp.Color,
600
                                ColorMethod = colorMethodType.byEntity
601
                            };
602
                            res.Add(line);
603
                        }
604
                    }
605
                /// PORT, ARROW로 시작하는 블럭은 제외
606
                else if (y is BlockReference subblkref && subblkref.BlockName != "PORT")
607
                    {
608
                        res.AddRange(ExplodeBlockReference(Blocks, subblkref, LayerName, color));
609
                    }
610
                });
611

    
612
                var attributes = blkref.Attributes.ToList();
613
                foreach (var ent in entities.Where(y => y is devDept.Eyeshot.Entities.Attribute attr && !attr.Invisible))
614
                {
615
                    var txt = ent as devDept.Eyeshot.Entities.Attribute;
616
                    #region 텍스트가 뒤집어지는 것을 방지하기 위해 평면을 교체
617
                    if (txt.Plane.AxisX.Equals(devDept.Geometry.Vector3D.AxisMinusX) && txt.Plane.AxisY.Equals(devDept.Geometry.Vector3D.AxisY))
618
                    {
619
                        txt.Plane = new devDept.Geometry.Plane(txt.Plane.Origin, devDept.Geometry.Vector3D.AxisX, devDept.Geometry.Vector3D.AxisY);
620
                    }
621
                    #endregion
622
                    txt.LayerName = LayerName;
623
                    txt.Color = color;
624
                    txt.ColorMethod = colorMethodType.byEntity;
625
                    KeyValuePair<string, AttributeReference>? kp = attributes.FirstOrDefault(z => z.Key == txt.Tag);
626
                    if (kp.HasValue)
627
                    {
628
                        ///attributes.RemoveAll(x => x.Key == txt.Tag);
629
                        txt.TextString = (kp.Value.Value) != null ? kp.Value.Value.Value : string.Empty;
630
                        /*
631
                        if (string.IsNullOrEmpty(txt.TextString))
632
                        {
633
                            var attr = attributes.FirstOrDefault(x => !string.IsNullOrEmpty(x.Value.Value)).Value;
634
                            if (attr != null)
635
                            {
636
                                txt.TextString = attr.Value;
637
                                attributes.RemoveAll(x => x.Value.Equals(attr));
638
                            }
639
                        }
640
                        */
641
                    }
642
                }
643

    
644
                res.AddRange(entities.Where(y =>
645
                {
646
                    if (y is devDept.Eyeshot.Entities.Attribute attr && (string.IsNullOrEmpty(attr.TextString) || attr.Invisible)) return false;
647
                    if (y is devDept.Eyeshot.Entities.Text text && string.IsNullOrEmpty(text.TextString)) return false;
648
                    if (y is devDept.Eyeshot.Entities.Point) return false;
649
                    if (y is BlockReference subblkref) return false;
650
                    if (y is LinearPath) return false;
651
                    if (y.LayerName.ToUpper() == "AS_PORT") return false;
652
                    return true;
653
                }));
654

    
655
                #region 제외 레이어에 속한 항목은 포함하지 않는다.
656
                res.RemoveAll(x =>
657
                {
658
                    return Forms.ExceptLayer.ExceptLayers.Exists(y => y.Name.ToUpper() == x.LayerName.ToUpper() && !y.Visible);
659
                });
660
                #endregion
661
                foreach (var ent in res) ent.LayerName = LayerName;
662

    
663
                blkref.Attributes.Clear();
664
                ///blkref.UpdateBoundingBox(new TraversalParams(design));
665
            }
666
            catch(Exception ex)
667
            {
668
                Console.WriteLine(ex.Message);
669
            }
670

    
671
            return res;
672
        }
673

    
674
        /// <summary>
675
        /// 주어진 도면의 원본과 AVEVA를 비교한다.
676
        /// </summary>
677
        private void CompareDrawing(Document doc, bool ResultOnly = false)
678
        {
679
            /// AutoCAD P&ID 파일을 화면에 표시한다.
680
            void ShowAutoCADFile(string FilePath, Design design, bool clear = true)
681
            {
682
                if (clear) design.Clear();
683
                var AddEntities = new List<Entity>();
684

    
685
                if (System.IO.File.Exists(FilePath))
686
                {
687
                    try
688
                    {
689
                        #region 다른 프로세스에서 파일을 열고 있는 경우 처리
690
                        using (var fs = File.Open(FilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
691
                        #endregion
692

    
693
                        {
694
                            devDept.Eyeshot.Translators.ReadAutodesk ra = new devDept.Eyeshot.Translators.ReadAutodesk(fs);
695
                            ra.DoWork();
696
                            var min = ra.Min;
697
                            if (!ra.Layers.Contains(Verification.AutoCADLayer)) ra.Layers.Add(Verification.AutoCADLayer, Verification.AutoCADColor);
698
                            if (!ra.Layers.Contains(Verification.AutoCADDiffLayer)) ra.Layers.Add(Verification.AutoCADDiffLayer, Verification.DiffColor);
699
                            if (!ra.Layers.Contains(Verification.AutoCADExceptLayer)) ra.Layers.Add(Verification.AutoCADExceptLayer, Verification.AutoCADColor);
700
                            foreach (var ent in ra.Entities)
701
                            {
702
                                /// 도면을 원점으로 맞춘다.
703
                                if (min.X != 0 && min.Y != 0) ent.Translate(-min.X, -min.Y);
704

    
705
                                if (ent is BlockReference blkref)
706
                                {
707
                                    AddEntities.AddRange(ExplodeBlockReference(ra.Blocks, blkref, Verification.AutoCADLayer, Verification.AutoCADColor));
708
                                }
709
                            }
710
                            ra.AddToScene(design);
711
                        }
712
                    }
713
                    catch (Exception ex)
714
                    {
715
                        RadMessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, RadMessageIcon.Error);
716
                        return;
717
                    }
718

    
719
                    #region LinearPath를 Line으로 분할한다.
720
                    design.Entities.ForEach(x =>
721
                    {
722
                        if (x is LinearPath lp)
723
                        {
724
                            #region 정점 수가 2이고 LineWeight이 0 초과이고 길이가 ArrowMaxLength보다 작을때 화살표를 그려준다.
725
                            if (lp.Vertices.Count() == 2 && lp.LineWeight > 0 && lp.Length() < Forms.ExceptLayer.ArrowMaxLength)
726
                            {
727
                                double weight = lp.LineWeight;
728
                                var dir = new devDept.Geometry.Vector3D(lp.Vertices[0], lp.Vertices[1]);
729
                                dir.Normalize();
730
                                var cross = devDept.Geometry.Vector3D.Cross(devDept.Geometry.Vector3D.AxisZ, dir);
731
                                var pts = new devDept.Geometry.Point3D[]
732
                                {
733
                                    lp.Vertices[1] + cross * weight * 0.5,
734
                                    lp.Vertices[0],
735
                                    lp.Vertices[1] - cross * weight * 0.5
736
                                };
737

    
738
                                var hatch = new Hatch("SOLID", new List<ICurve>() { new LinearPath(pts) });
739
                                AddEntities.Add(hatch);
740
                            }
741
                            #endregion
742
                            else
743
                            {
744
                                int count = Convert.ToInt32(lp.Vertices.Length);
745
                                for (int i = 0; i < count - 1; ++i)
746
                                {
747
                                    AddEntities.Add(new devDept.Eyeshot.Entities.Line(lp.Vertices[i], lp.Vertices[i + 1])
748
                                    {
749
                                        LayerName = lp.LayerName,
750
                                        LineWeight = lp.LineWeight,
751
                                        LineTypeMethod = colorMethodType.byEntity
752
                                    });
753
                                }
754
                            }
755
                        }
756
                    });
757
                    design.Entities.RemoveAll(x => (x is LinearPath));
758
                    #endregion
759

    
760
                    design.Entities.AddRange(AddEntities);
761

    
762
                    #region 브랜치가 생성되는 부분에서 파이프 라인을 분할
763
                    var queue = design.Entities.Where(x => x is Line && 
764
                    Forms.ExceptLayer.LineLayers.Exists(y => y.Name.ToUpper() == x.LayerName.ToUpper())).ToList();
765
                    while (queue.Any())
766
                    {
767
                        var line1 = queue.First() as Line;
768
                        var dir1 = line1.Direction;
769
                        dir1.Normalize();
770
                        queue.Remove(line1);
771
                        for (int i = 0; i < queue.Count; ++i)
772
                        {
773
                            var line2 = queue.ElementAt(i) as Line;
774
                            var dir2 = line2.Direction;
775
                            dir2.Normalize();
776
                            if (devDept.Geometry.Vector3D.AreOrthogonal(dir1, dir2))
777
                            {
778
                                var intersects = line1.IntersectWith(line2);
779
                                if (intersects.Count() == 1)
780
                                {
781
                                    if (line1.StartPoint.DistanceTo(intersects[0]) > 0.1 && line1.EndPoint.DistanceTo(intersects[0]) > 0.1)
782
                                    {
783
                                        var split1 = new devDept.Eyeshot.Entities.Line(line1.StartPoint, intersects[0])
784
                                        {
785
                                            LayerName = line1.LayerName,
786
                                            LineWeight = line1.LineWeight,
787
                                            LineTypeMethod = colorMethodType.byEntity
788
                                        };
789
                                        var split2 = new devDept.Eyeshot.Entities.Line(intersects[0], line1.EndPoint)
790
                                        {
791
                                            LayerName = line1.LayerName,
792
                                            LineWeight = line1.LineWeight,
793
                                            LineTypeMethod = colorMethodType.byEntity
794
                                        };
795
                                        design.Entities.Add(split1);
796
                                        design.Entities.Add(split2);
797
                                        design.Entities.Remove(line1);
798

    
799
                                        queue.Add(split1);
800
                                        queue.Add(split2);
801

    
802
                                        break;
803
                                    }
804

    
805
                                    if (line2.StartPoint.DistanceTo(intersects[0]) > 0.1 && line2.EndPoint.DistanceTo(intersects[0]) > 0.1)
806
                                    {
807
                                        var split1 = new devDept.Eyeshot.Entities.Line(line2.StartPoint, intersects[0])
808
                                        {
809
                                            LayerName = line2.LayerName,
810
                                            LineWeight = line2.LineWeight,
811
                                            LineTypeMethod = colorMethodType.byEntity
812
                                        };
813
                                        var split2 = new devDept.Eyeshot.Entities.Line(intersects[0], line2.EndPoint)
814
                                        {
815
                                            LayerName = line2.LayerName,
816
                                            LineWeight = line2.LineWeight,
817
                                            LineTypeMethod = colorMethodType.byEntity
818
                                        };
819
                                        design.Entities.Add(split1);
820
                                        design.Entities.Add(split2);
821
                                        design.Entities.Remove(line2);
822

    
823
                                        queue.Remove(line2);
824
                                        queue.Add(split1);
825
                                        queue.Add(split2);
826
                                    }
827
                                }
828
                            }
829
                        }
830
                    }
831
                    #endregion
832

    
833
                    #region 레이어 변경
834
                    foreach (var ent in design.Entities)
835
                    {
836
                        ent.Color = Verification.AutoCADColor;
837
                        ent.ColorMethod = colorMethodType.byEntity;
838
                        if (!Forms.ExceptLayer.ExceptLayers.Exists(x => x.Name.ToUpper() == ent.LayerName.ToUpper()))
839
                        {
840
                            ent.LayerName = Verification.AutoCADLayer;
841
                        }
842
                        else
843
                        {
844
                            ent.LayerName = Verification.AutoCADExceptLayer;
845
                        }
846
                    }
847
                    #endregion
848

    
849
                    #region 블럭이거나 제외 레이어에 속한 항목은 제거
850
                    design.Entities.RemoveAll(x => (x is BlockReference) || Forms.ExceptLayer.ExceptLayers.Exists(y => y.Name.ToUpper() == x.LayerName.ToUpper() && !y.Visible));
851
                    #endregion
852

    
853
                    #region 눈에 보이지 않는 라인은 제거
854
                    design.Entities.RemoveAll(x => x is Line line && line.Length() < 0.001);
855
                    #endregion
856

    
857
                    ColorEntities(design, design.Entities, Verification.AutoCADColor);
858

    
859
                    // Sets the view as Top
860
                    design.SetView(viewType.Top);
861
                    design.ZoomFit();
862
                    design.Invalidate();
863
                }
864
            }
865

    
866
            /// AVEVA P&ID 파일을 화면에 표시한다.
867
            void ShowAVEVAPIDFile(string FilePath, Design design, bool clear = true)
868
            {
869
                if (clear) design.Clear();
870
                if (System.IO.File.Exists(FilePath))
871
                {
872
                    var AddEntities = new List<Entity>();
873

    
874
                    #region 다른 프로세스에서 파일을 열고 있는 경우 처리
875
                    using (var fs = File.Open(FilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
876
                    #endregion
877
                    {
878
                        devDept.Eyeshot.Translators.ReadAutodesk ra = new devDept.Eyeshot.Translators.ReadAutodesk(fs);
879
                        ra.DoWork();
880

    
881
                        if (!ra.Layers.Contains(Verification.AVEVALayer)) ra.Layers.Add(Verification.AVEVALayer, Verification.AVEVAColor);
882
                        if (!ra.Layers.Contains(Verification.AVEVADiffLayer)) ra.Layers.Add(Verification.AVEVADiffLayer, Verification.DiffColor);
883
                        if (!ra.Layers.Contains(Verification.AVEVAExceptLayer)) ra.Layers.Add(Verification.AVEVAExceptLayer, Verification.AVEVAColor);
884
                        var min = ra.Min;
885
                        foreach (var ent in ra.Entities)
886
                        {
887
                            /// 도면을 원점으로 맞춘다.
888
                            if (min.X != 0 && min.Y != 0) ent.Translate(-min.X, -min.Y);
889

    
890
                            #region 멀티 라인들을 분할하여 추가한다.
891
                            if (ent is Mesh mesh && (mesh.LayerName == "AS_PIPE" || mesh.LayerName == "AS_INST"))
892
                            {
893
                                int count = Convert.ToInt32(mesh.Vertices.Length * 0.5);
894
                                for (int i = 0; i < count - 1; ++i)
895
                                {
896
                                    AddEntities.Add(new devDept.Eyeshot.Entities.Line(mesh.Vertices[i], mesh.Vertices[i + 1])
897
                                    {
898
                                        LayerName = Verification.AVEVALayer,
899
                                        LineWeight = 3.0f,
900
                                        LineTypeMethod = colorMethodType.byEntity,
901
                                        Color = Verification.AVEVAColor,
902
                                        ColorMethod = colorMethodType.byEntity
903
                                    });
904
                                }
905
                            }
906
                            else if (ent is TabulatedSurface tf && (tf.LayerName == "AS_PIPE" || tf.LayerName == "AS_INST"))
907
                            {
908
                                int count = Convert.ToInt32(tf.ControlPoints.Length * 0.5);
909
                                for (int i = 0; i < count - 1; ++i)
910
                                {
911
                                    AddEntities.Add(
912
                                        new devDept.Eyeshot.Entities.Line(
913
                                        new devDept.Geometry.Point3D(tf.ControlPoints[i, 0].X, tf.ControlPoints[i, 0].Y, 0),
914
                                        new devDept.Geometry.Point3D(tf.ControlPoints[i + 1, 0].X, tf.ControlPoints[i + 1, 0].Y, 0))
915
                                        {
916
                                            LayerName = Verification.AVEVALayer,
917
                                            LineWeight = 3.0f,
918
                                            LineTypeMethod = colorMethodType.byEntity,
919
                                            Color = Verification.AVEVAColor,
920
                                            ColorMethod = colorMethodType.byEntity
921
                                        }
922
                                    );
923
                                }
924
                            }
925
                            else if (ent is LinearPath lp)
926
                            {
927
                                string LayerName = Forms.ExceptLayer.ExceptLayers.Exists(x => x.Name.ToUpper() == lp.LayerName.ToUpper()) ?
928
                                    Verification.AVEVAExceptLayer : Verification.AVEVALayer;
929
                                int count = Convert.ToInt32(lp.Vertices.Length);
930
                                for (int i = 0; i < count - 1; ++i)
931
                                {
932
                                    AddEntities.Add(new devDept.Eyeshot.Entities.Line(lp.Vertices[i], lp.Vertices[i + 1])
933
                                    {
934
                                        LayerName = LayerName,
935
                                        LineWeight = lp.LineWeight,
936
                                        Color = Verification.AVEVAColor,
937
                                        LineTypeMethod = colorMethodType.byEntity
938
                                    });
939
                                }
940

    
941
                                #region 밑에서 제거하기 위해 레이어를 AVEVALayer로 바꿔준다.
942
                                lp.LayerName = Verification.AVEVALayer;
943
                                #endregion
944
                            }
945
                            #endregion
946
                            else if (ent is BlockReference blkref)
947
                            {
948
                                if (blkref.BlockName != "LBRK" && blkref.BlockName != "PSNODE" && blkref.BlockName != "PENODE")
949
                                {
950
                                    AddEntities.AddRange(ExplodeBlockReference(ra.Blocks, blkref, Verification.AVEVALayer, Verification.AVEVAColor));
951
                                }
952
                            }
953

    
954
                            ent.Color = Verification.AVEVAColor;
955
                            ent.ColorMethod = colorMethodType.byEntity;
956
                            if (!Forms.ExceptLayer.ExceptLayers.Exists(x => x.Name.ToUpper() == ent.LayerName.ToUpper()))
957
                            {
958
                                ent.LayerName = Verification.AVEVALayer;
959
                            }
960
                            else
961
                            {
962
                                ent.LayerName = Verification.AVEVAExceptLayer;
963
                            }
964
                        }
965
                        ra.AddToScene(design);
966
                    }
967

    
968
                    #region 불필요한 블럭들은 제거
969
                    design.Entities.RemoveAll(x => x is BlockReference);
970
                    #endregion
971

    
972
                    #region 블럭을 깸
973
                    design.Entities.Where(x => x.LayerName == Verification.AVEVALayer).ToList().ForEach(x =>
974
                    {
975
                        if(x is BlockReference blkref)
976
                        {
977
                            AddEntities.AddRange(ExplodeBlockReference(design.Blocks, blkref, Verification.AVEVALayer, Verification.AVEVAColor));
978
                        }
979
                    });
980
                    design.Entities.RemoveAll(x =>
981
                    ((x is Mesh || x is TabulatedSurface) && (x.LayerName == Verification.AVEVALayer)) ||
982
                    (x is LinearPath && x.LayerName == Verification.AVEVALayer) || (x is BlockReference) ||
983
                    Forms.ExceptLayer.ExceptLayers.Exists(y => y.Name.ToUpper() == x.LayerName.ToUpper() && !y.Visible));
984
                    design.Entities.AddRange(AddEntities);
985
                    #endregion
986

    
987
                    #region 눈에 보이지 않는 라인은 제거
988
                    design.Entities.RemoveAll(x => x is Line line && line.Length() < 0.001);
989
                    #endregion
990

    
991
                    ColorEntities(design, design.Entities.Where(x => x.LayerName == Verification.AVEVALayer).ToList(), Verification.AVEVAColor);
992

    
993
                    design.SetView(viewType.Top);
994
                    design.ZoomFit();
995
                    design.Invalidate();
996
                }
997
            }
998

    
999
            string dwgExtension = ".dwg";
1000
            string ID2DrawingFolder = Program.AutoCADFolder;
1001
            string dwgFilePath = System.IO.Path.Combine(ID2DrawingFolder, $"{doc.DocumentNo}{dwgExtension}");
1002
            if (!ResultOnly) ShowAutoCADFile(dwgFilePath, this.designAutoCAD);
1003
            ShowAutoCADFile(dwgFilePath, this.designCompare);
1004

    
1005
            string AVEVAPIDFolder = Program.AVEVAPIDFolder;
1006
            string AVEVAPIDFilePath = string.Empty;
1007
            if (AVEVAPIDFolder != null)
1008
            {
1009
                AVEVAPIDFilePath = System.IO.Path.Combine(AVEVAPIDFolder, $"{doc.DocumentNo}{dwgExtension}");
1010
                if (!ResultOnly) ShowAVEVAPIDFile(AVEVAPIDFilePath, this.designAVEVA);
1011
                ShowAVEVAPIDFile(AVEVAPIDFilePath, this.designCompare, false);
1012
            }
1013

    
1014
            if (System.IO.File.Exists(dwgFilePath) && System.IO.File.Exists(AVEVAPIDFilePath))
1015
            {
1016
                #region 비교 작업 수행
1017
                var AutoCADEntities = this.designCompare.Entities.Where(x => x.LayerName == Verification.AutoCADLayer).ToList();
1018
                var AVEVAtities = this.designCompare.Entities.Where(x => x.LayerName == Verification.AVEVALayer).ToList();
1019
                var workunit = new Classes.CompareModelWorkUnit(this.designCompare, AutoCADEntities, AVEVAtities);
1020
                workunit.Tolerance = Verification.Tolerance;
1021
                workunit.LengthToleranceRatio = Verification.LengthToleranceRatio;
1022
                workunit.AutoCADDiffLayer = Verification.AutoCADDiffLayer;
1023
                workunit.AVEVADiffLayer = Verification.AVEVADiffLayer;
1024
                workunit.DiffColor = Verification.DiffColor;
1025
                workunit.RevCloudLayer = Verification.RevCloudLayer;
1026
                workunit.RevCloudColor = Verification.RevCloudColor;
1027
                workunit.SpecialCharacters.AddRange(Forms.ExceptLayer.SpecialCharacters);
1028
                workunit.Casesensitive = Casesensitive;
1029
                if (!this.designCompare.IsBusy && !ResultOnly)
1030
                {
1031
                    this.designCompare.StartWork(workunit);
1032
                }
1033
                else
1034
                {
1035
                    workunit.DoWork();
1036
                    ApplyLayers();
1037
                }
1038
                #endregion
1039
            }
1040
        }
1041

    
1042
        #region Camera Sync
1043
        private void CameraChanged(object sender, devDept.Eyeshot.Workspace.CameraMoveEventArgs e)
1044
        {
1045
            if (sender == this.designAutoCAD)
1046
            {
1047
                SyncCamera(this.designAutoCAD, this.designAVEVA);
1048
                SyncCamera(this.designAutoCAD, this.designCompare);
1049
            }
1050
            else if (sender == this.designAVEVA)
1051
            {
1052
                SyncCamera(this.designAVEVA, this.designAutoCAD);
1053
                SyncCamera(this.designAVEVA, this.designCompare);
1054
            }
1055
            else
1056
            {
1057
                SyncCamera(this.designCompare, this.designAutoCAD);
1058
                SyncCamera(this.designCompare, this.designAVEVA);
1059
            }
1060
        }
1061

    
1062
        private void SyncCamera(Design designMovedCamera, Design designCameraToMove)
1063
        {
1064
            Camera savedCamera;
1065
            designMovedCamera.SaveView(out savedCamera);
1066

    
1067
            // restores the camera to the other model
1068
            designCameraToMove.RestoreView(savedCamera);
1069
            designCameraToMove.AdjustNearAndFarPlanes();
1070
            designCameraToMove.Invalidate();
1071
        }
1072
        #endregion
1073
    }
1074
}
클립보드 이미지 추가 (최대 크기: 500 MB)