Форум программистов, компьютерный форум, киберфорум
Наши страницы
SolidWorks
Войти
Регистрация
Восстановить пароль
 
Armando_More
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 9
1

Скорость рисования элементов в чертеже Solidworks во время выполнения кода C#

06.12.2017, 10:17. Просмотров 337. Ответов 11
Метки нет (Все метки)

Я написала код в Visual Studio для SolidWorks 2012, который выполняет создание чертежа на основании 3В детали (основные виды), разрезы, сечения и проставления размеров. Можно ли увеличить скорость отрисовки элементов во время выполнения кода, так как сейчас это делается недостаточно быстро? Есть ли функция, которая бы ускорила этот процесс?

Ниже указан часть кода для прорисовки основных видов, создание разреза и обрезка видов.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using SolidWorks.Interop.sldworks;
using SolidWorks.Interop.swcommands;
using SolidWorks.Interop.swconst;
using System.IO;
 
namespace CreateDrawing
{
    public partial class Form1 : Form
    {
        SldWorks swApp;
     
        public Form1()
        {
            InitializeComponent();
        }
        //функция проверки открытия файла
        public bool IsFileOpen(string path)
        {
            if (string.IsNullOrEmpty(path))
                throw new ArgumentException("'path' cannot be null or empty.", "path");
 
            try
            {
                using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read)) { }
            }
            catch (IOException)
            {
                return true;
            }
            return false;
        }
               private void button2_Click(object sender, EventArgs e)
        {
            Close();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            string User;
            User = System.Environment.UserName;
            ModelDoc2 Part;
            SelectionMgr swSelMgr;
            SolidWorks.Interop.sldworks.View myView;
            DrawingDoc swDrawing;
 
            //запускает SolidWorks2012
            //object processSW = System.Activator.CreateInstance(System.Type.GetTypeFromProgID("SldWorks.Application"));
            Guid myGuid1 = new Guid("B4875E89-91F6-4124-BB63-2539727E98FA"); //GUID для Solidworks 2012
            object processSW = System.Activator.CreateInstance(System.Type.GetTypeFromCLSID(myGuid1));
 
            swApp = (SldWorks)processSW;
            swApp.Visible = true;
 
            int longstatus = 0;
            int longwarnings = 0;
 
            try
            {
                Part = (ModelDoc2)swApp.ActiveDoc;
                if (IsFileOpen("C:\\IM\\IMWork\\Направляющий аппарат с торовой поверхностью.SLDPRT"))
                {
                    goto a;
                }
                else
                {
                    Part = (ModelDoc2)swApp.OpenDoc6(@"C:\IM\IMWork\Направляющий аппарат с торовой поверхностью.SLDPRT", 1, 0, "", ref longstatus, ref longwarnings);
                    goto a;
                };
                a:
                bool boolstatus;
                Object vScaleRatio;
                string retval;
            retval = swApp.GetUserPreferenceStringValue((int)swUserPreferenceStringValue_e.swDefaultTemplateDrawing);
            //Part = swApp.NewDocument(@"C:\ProgramData\SolidWorks\SolidWorks 2012\templates\gost-part drw.drwdot", 0, 0, 0);
            Part  = (ModelDoc2)swApp.NewDocument(retval, 0, 0, 0);
            swSelMgr = Part.SelectionManager as SelectionMgr;
            swDrawing = Part as DrawingDoc;
            myView = (SolidWorks.Interop.sldworks.View)swDrawing.CreateDrawViewFromModelView3("C:\\IM\\IMWork\\Направляющий аппарат с торовой поверхностью.SLDPRT", "*Слева", 0.13835806060864, 8.53251696525708E-02, 0);
                boolstatus = Part.Extension.SelectByID2("Чертежный вид1", "DRAWINGVIEW", 0, 0, 0, false, 0, null, 0);
                boolstatus = swDrawing.ActivateView("Чертежный вид1");
                vScaleRatio = myView.ScaleRatio;
                myView.ScaleDecimal = myView.ScaleDecimal * 5;
                Part.EditRebuild3();
                myView = swDrawing.CreateUnfoldedViewAt3(-0.210437678570781, 8.53251696525708E-02, 0, false);
                Part.ClearSelection2(true);
                boolstatus = Part.Extension.SelectByID2("Чертежный вид1", "DRAWINGVIEW", 0, 0, 0, false, 0, null, 0);
                myView = swDrawing.CreateUnfoldedViewAt3(0.516477335382791, 8.53251696525708E-02, 0, false);
                Part.ClearSelection2(true);
                Part.ViewZoomtofit2();
 
                object pointArray, skSegment, myCenterLine;
                double[] points1;
                double[] points2;
                double[] points3;
                double Beta, D2, BetaToRad, L12;
                const double pi = 3.14159265358979;
             
                Beta = 5;//////////////////////////////
                BetaToRad = Beta * pi / 180;
                D2 = 420;////////////////////////////
                L12 = 64;///////////////////////////
 
                boolstatus = swDrawing.ActivateView("Чертежный вид1");
 
                skSegment = Part.SketchManager.CreateLine(0 - 0.04, -(((D2) / 2) + 10) / 1000.0, 0, 0 - 0.04, (((D2) / 2) + 10) / 1000.0, 0);
                skSegment = Part.SketchManager.CreateLine(0 - 0.04, (((D2) / 2) + 10) / 1000.0, 0, ((L12) + 10) / 1000.0, (((D2) / 2) + 10) / 1000.0, 0);
                skSegment = Part.SketchManager.CreateLine(((L12) + 10) / 1000.0, (((D2) / 2) + 10) / 1000.0, 0, ((L12) + 10) / 1000.0, -(((D2) / 2) + 10) / 1000.0, 0);
                skSegment = Part.SketchManager.CreateLine(((L12) + 10) / 1000.0, -(((D2) / 2) + 10) / 1000.0, 0, 0 - 0.04, -(((D2) / 2) + 10) / 1000.0, 0);
 
                boolstatus = Part.Extension.SelectByID2("Line1", "SKETCHSEGMENT", 0, 0, 0, false, 0, null, 0);
                boolstatus = Part.Extension.SelectByID2("Line2", "SKETCHSEGMENT", 0, 0, 0, false, 0, null, 0);
                boolstatus = Part.Extension.SelectByID2("Line3", "SKETCHSEGMENT", 0, 0, 0, false, 0, null, 0);
                boolstatus = Part.Extension.SelectByID2("Line4", "SKETCHSEGMENT", 0, 0, 0, false, 0, null, 0);
                swDrawing.CreateBreakOutSection(((D2) / 2) / 1000.0);
                Part.ClearSelection2(true);
 
                boolstatus = swDrawing.ActivateView("Чертежный вид1");
                boolstatus = Part.Extension.SelectByID2("", "EDGE", 0.139425110594787, 0.142762852404969, 0, false, 0, null, 0);
                boolstatus = Part.Extension.SelectByID2("", "EDGE", 0.14214405415703, 2.72077510096118E-02, 0, true, 0, null, 0);
 
                myCenterLine = swDrawing.InsertCenterLine2();
                Part.ClearSelection2(true);
                boolstatus = swDrawing.ActivateView("Чертежный вид2");
 
                points1 = new double[33];
                points1[0] = -0.214318;
                points1[1] = -4.52024367223014E-02;
                points1[2] = 0;
                points1[3] = -0.117115767649788;
                points1[4] = -2.82090394582783E-02;
                points1[5] = 0;
                points1[6] = 5.91642854173952E-03;
                points1[7] = -3.29671906922048E-02;
                points1[8] = 0;
                points1[9] = 0.124870209389901;
                points1[10] = -3.02482471299611E-02;
                points1[11] = 0;
                points1[12] = 0.222752177630675;
                points1[13] = -3.56861342544485E-02;
                points1[14] = 0;
                points1[15] = 0.21935349817787;
                points1[16] = 0.111816553997272;
                points1[17] = 0;
                points1[18] = 0.201000629132725;
                points1[19] = 0.230770334845434;
                points1[20] = 0;
                points1[21] = 4.55695676061768E-03;
                points1[22] = 0.241646109094409;
                points1[23] = 0;
                points1[24] = -0.214318; ;
                points1[25] = 0.244365052656653;
                points1[26] = 0;
                points1[27] = -0.214318;
                points1[28] = 0.11045708221615;
                points1[29] = 0;
                points1[30] = -0.214318;
                points1[31] = -4.52024367223014E-02;
                points1[32] = 0;
                pointArray = points1;
                skSegment = Part.SketchManager.CreateSpline((pointArray));
                myView = swDrawing.ActiveDrawingView;
                longstatus = myView.Crop();
                boolstatus = Part.Extension.SelectByID2("Spline1", "SKETCHSEGMENT", 0, 0, 0, false, 0, null, 0);
                longstatus = myView.Crop();
 
                boolstatus = swDrawing.ActivateView("Чертежный вид1");
                points2 = new double[27];
                points2[0] = -4.24360470097527E-02;
                points2[1] = -4.24834931600578E-02;
                points2[2] = 0;
                points2[3] = -2.92421794975378E-04;
                points2[4] = -0.031607718911083;
                points2[5] = 0;
                points2[6] = 3.84525239669974E-02;
                points2[7] = -3.77253419261313E-02;
                points2[8] = 0;
                points2[9] = 4.86485623254112E-02;
                points2[10] = 5.74376827523982E-02;
                points2[11] = 0;
                points2[12] = 4.93282982159721E-02;
                points2[13] = 0.210378258128606;
                points2[14] = 0;
                points2[15] = 1.06704998614657E-03;
                points2[16] = 0.219894560596459;
                points2[17] = 0;
                points2[18] = -4.24360470097527E-02;
                points2[19] = 0.22057429648702;
                points2[20] = 0;
                points2[21] = -4.24360470097527E-02;
                points2[22] = 7.57905517975432E-02;
                points2[23] = 0;
                points2[24] = -4.24360470097527E-02;
                points2[25] = -4.24834931600578E-02;
                points2[26] = 0;
                pointArray = points2;
                skSegment = Part.SketchManager.CreateSpline((pointArray));
                myView = swDrawing.ActiveDrawingView;
                longstatus = myView.Crop();
                boolstatus = Part.Extension.SelectByID2("Spline1", "SKETCHSEGMENT", 0, 0, 0, false, 0, null, 0);
                longstatus = myView.Crop();
 
                boolstatus = swDrawing.ActivateView("Чертежный вид3");
                points3 = new double[33];
                points3[0] = -0.218673762287309;
                points3[1] = -0.049280852065667;
                points3[2] = 0;
                points3[3] = -0.101079453220269;
                points3[4] = -2.00522087715472E-02;
                points3[5] = 0;
                points3[6] = -4.7854141725201E-04;
                points3[7] = -4.58821726128624E-02;
                points3[8] = 0;
                points3[9] = 0.104880521619691;
                points3[10] = -2.27711523337909E-02;
                points3[11] = 0;
                points3[12] = 0.213638264109439;
                points3[13] = -5.74376827523981E-02;
                points3[14] = 0;
                points3[15] = 0.214997735890561;
                points3[16] = 8.73460619370789E-02;
                points3[17] = 0;
                points3[18] = 0.191206979720929;
                points3[19] = 0.232129806626556;
                points3[20] = 0;
                points3[21] = 1.71945917373321E-02;
                points3[22] = 0.236887957860482;
                points3[23] = 0;
                points3[24] = -0.218673762287309;
                points3[25] = 0.236208221969921;
                points3[26] = 0;
                points3[27] = -0.213915611053382;
                points3[28] = 8.19081748125915E-02;
                points3[29] = 0;
                points3[30] = -0.218673762287309;
                points3[31] = -0.049280852065667;
                points3[32] = 0;
                pointArray = points3;
                skSegment = Part.SketchManager.CreateSpline((pointArray));
                myView = swDrawing.ActiveDrawingView;
                longstatus = myView.Crop();
                boolstatus = Part.Extension.SelectByID2("Spline1", "SKETCHSEGMENT", 0, 0, 0, false, 0, null, 0);
                longstatus = myView.Crop();
                Part.ClearSelection2(true);
 
            longstatus = Part.SaveAs3(@"C:\IM\IMWork\Направляющий аппарат с торовой поверхностью.DWG", 0, 2);
 
                MessageBox.Show(@"Чертеж был успешно построен и сохранен в папку C:\IM\IMWORK\Направляющий аппарат с торовой поверхностью.DWG");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}
Ссылка на файлы: https://www.dropbox.com/sh/ov0yfjij7...2kcKbOGia?dl=0

Буду очень благодарна за помощь!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2017, 10:17
Ответы с готовыми решениями:

Тормозит изменение взаимного расположения проекций на чертеже в SolidWorks
Доброго времени суток, уважаемые. собственно, проблема описана выше. железо: ...

Засечь время выполнения (в ms) определённого кода или части кода
Доброго времени суток всем. Хотелось бы поинтересоваться у знающих людей....

Оценить скорость (время) выполнения метода
Нельзя ли никак сию задачу решить? То есть к примеру, написал я метод,...

Scheme - скорость выполнения кода
Началось все с одной несложной задачки -...

Максимально сократить скорость выполнения кода
Привет всем, есть такой код: (Выполняет скачивание строк с хешкодом/путем до...

11
densy
86 / 84 / 19
Регистрация: 30.08.2015
Сообщений: 360
08.12.2017, 11:20 2
Цитата Сообщение от Armando_More Посмотреть сообщение
Есть ли функция, которая бы ускорила этот процесс?
такой нет.

Попробуйте следующее (направленные на уменьшение потребляемых ресурсов компъютера):
1) Работать с солидом в фоновом режиме;
2)
C#
1
 swApp.UserControl = false;
3) уменьшить точность отрисовки и включить опцию режим большой сборки.

Добавлено через 6 минут
если все же нужно видеть окно солида на момент работы кода тогда:
1) уменьшить окно солида к минимуму
2) не обновлять виды
C#
1
   .EnableGraphicsUpdate  =  False;
1
Armando_More
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 9
13.12.2017, 09:39  [ТС] 3
Спасибо! Функция EnableGraphicsUpdate помогла увеличить скорость выполнения кода.
0
Linoge
Эксперт Hardware
2241 / 1564 / 259
Регистрация: 25.10.2011
Сообщений: 4,738
13.12.2017, 19:18 4
Armando_More, а может вообще погасить окно на время выполнения кода?
Если правильно понял swApp.Visible = False; а после обработки высветить.
Когда работал с e3series прокатывало.
0
densy
86 / 84 / 19
Регистрация: 30.08.2015
Сообщений: 360
18.12.2017, 00:45 5
Armando_More, получается что вам все таки нужен графический интерфейс тогда еще вариант включить опцию OpenGL (немножко уменьшит нагрузку на видеокарту)

Скорость рисования элементов в чертеже Solidworks во время выполнения кода C#


непомню точно вроде с 15 версии солидворкс перешел на профессиональные видеокарты и что бы использовать другую требуется правки в реестре, иначе насколько понимаю изображение рендерится процессором.
0
Armando_More
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 9
09.02.2018, 14:58  [ТС] 6
Это не совсем то что нужно. Лучше чтобы видно было, что процесс идет, а то пользователи могут подумать что солид закрылся. Но спасибо, буду иметь в виду.
0
densy
86 / 84 / 19
Регистрация: 30.08.2015
Сообщений: 360
09.02.2018, 15:26 7
Цитата Сообщение от Armando_More Посмотреть сообщение
что процесс идет,
может сделать прогрессбар ? с описанием текущей задачи ?
0
Armando_More
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 9
09.02.2018, 15:54  [ТС] 8
Цитата Сообщение от Linoge Посмотреть сообщение
Armando_More, а может вообще погасить окно на время выполнения кода?
Если правильно понял swApp.Visible = False; а после обработки высветить.
Когда работал с e3series прокатывало.
Это было бы хорошо. Можете пожалуйста подсказать как это сделать?

Цитата Сообщение от densy Посмотреть сообщение
Armando_More, получается что вам все таки нужен графический интерфейс тогда еще вариант включить опцию OpenGL (немножко уменьшит нагрузку на видеокарту)
непомню точно вроде с 15 версии солидворкс перешел на профессиональные видеокарты и что бы использовать другую требуется правки в реестре, иначе насколько понимаю изображение рендерится процессором.
Пробовала изменять его настройки, но у некоторых пользователей перестает работать подсветка элементов на модели при наведении на них в дереве конструирования .
0
Linoge
Эксперт Hardware
2241 / 1564 / 259
Регистрация: 25.10.2011
Сообщений: 4,738
09.02.2018, 16:03 9
Armando_More, swApp.Visible = False не прокатит?
0
Armando_More
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 9
12.02.2018, 10:21  [ТС] 10
Простите, я не много не на то сообщение ответила.

swApp.Visible = False не подойдет, так ка желательно чтобы солид был открыт на экране во время выполнения.

Цитата Сообщение от densy Посмотреть сообщение
может сделать прогрессбар ? с описанием текущей задачи ?
Вот это очень интересное предложение. Подскажите, пожалуйста, как это можно реализовать.
0
densy
86 / 84 / 19
Регистрация: 30.08.2015
Сообщений: 360
12.02.2018, 13:01 11
Armando_More, информации море по работе с ним.
https://msdn.microsoft.com/ru-ru/lib...v=vs.110).aspx
https://msdn.microsoft.com/ru-ru/library/t9fzsyec(v=vs.110).aspx
https://www.youtube.com/watch?v=6Ht0zjRkqgg
0
Armando_More
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 9
12.02.2018, 17:50  [ТС] 12
Цитата Сообщение от densy Посмотреть сообщение
Спасибо большое! Буду пробовать)
0
12.02.2018, 17:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.02.2018, 17:50

Почему плавает скорость выполнения кода?
Здравствуйте, заметил такое дело. Имеем часть кода Где pg-это...

Как отследить скорость выполнения кода в приложении
Всем привет. Есть проект, клиент говорит что одна из операций занимает много...

Узнать скорость выполнения определённого участка кода
Доброй ночи. Собственно вопрос заключается в следующем, нужно узнать скорость...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru