Перейти к публикации

Рекомендованные сообщения

NUMPL

1. "а swAnn должно должно соответствовать размеру d1@эскиз1." If swAnn.GetName = "d1@эскиз1" Then swAnn.Visible = True

2. На странице справки swAnnotationVisible = 1, что означает true

3. "выдает 91 ошибку" - на виде код не нашёл аннотаций.

3.1 Код не нашёл видов на чертеже.

Ссылка на сообщение
Поделиться на других сайтах


Sub main()

Set swApp = Application.SldWorks
Set Part = swApp.ActiveDoc

Dim swDraw As SldWorks.DrawingDoc
Dim swModel As SldWorks.ModelDoc2
Dim swView As SldWorks.View
Dim swAnn As SldWorks.Annotation

Set swModel = swApp.ActiveDoc
Set swDraw = swModel

Set swView = swDraw.GetFirstView
Set swAnn = swView.GetFirstAnnotation2
If swAnn.GetName = "d7@эскиз3" Then swAnn.Visible = True

Я правильно понимаю, мы нашли первый вид, на нем нашли все аннотации, в аннотациях нашли нужный размер и отобразили его? Ошибки больше не выдает, но и не работает...

Можно найти нужный вид и так ведь:

Set swSelMgr = swModel.SelectionManager
boolstatus = Part.Extension.SelectByID2("Чертежный вид16", "DRAWINGVIEW", 0.4417047183088, 0.5086936413499, 0, False, 0, Nothing, 0)
Set swView = swSelMgr.GetSelectedObject5(1)

но и так тоже не работает...

Изменено пользователем NUMPL
Ссылка на сообщение
Поделиться на других сайтах

NUMPL

Так, я был чуток не прав))

Сейчас, исправлюсь.

Надо получить от аннотации displayDimension

Sub main()

	Dim swApp					   As SldWorks.SldWorks

	Dim swModel					 As SldWorks.ModelDoc2

	Dim swDraw					  As SldWorks.DrawingDoc

	Dim swView					  As SldWorks.View

	Dim swDispDim				   As SldWorks.DisplayDimension

	Dim swDim					   As SldWorks.Dimension

	Dim swAnn					   As SldWorks.Annotation

	Dim bRet						As Boolean

	

	Set swApp = Application.SldWorks

	Set swModel = swApp.ActiveDoc

	Set swDraw = swModel

	Set swView = swDraw.GetFirstView

	Do While Not swView Is Nothing

		Debug.Print "  View = " & swView.Name

		Set swDispDim = swView.GetFirstDisplayDimension5

		Do While Not swDispDim Is Nothing

			Set swAnn = swDispDim.GetAnnotation

			Set swDim = swDispDim.GetDimension

			   If swDim.FullName = "RD2@Чертежный вид1@312.Drawing" Then

				  swAnn.Visible = swAnnotationVisibilityState_e.swAnnotationHidden

			   End If

			Set swDispDim = swDispDim.GetNext3

		Loop

		Set swView = swView.GetNextView

	Loop

End Sub
Ссылка на сообщение
Поделиться на других сайтах

streamdown

А я правильно понимаю, что swDim.FullName = "D7@Эскиз3@Лист1" - это полное имя размера с листом? swAnn.Visible = swAnnotationVisibilityState_e.swAnnotationHidden , я заменил swAnn.Visible = 1, чтоб отобразился размер...вроде правильно....но опять не работает зараза)

Do While Not swView Is Nothing

Debug.Print " View = " & swView.Name

Set swDispDim = swView.GetFirstDisplayDimension5

Do While Not swDispDim Is Nothing

Set swAnn = swDispDim.GetAnnotation

Set swDim = swDispDim.GetDimension

If swDim.FullName = "D7@Эскиз3@Лист1" Then

swAnn.Visible = 1

End If

Set swDispDim = swDispDim.GetNext3

Loop

Set swView = swView.GetNextView

Ссылка на сообщение
Поделиться на других сайтах

NUMPL

хмм...задачка))) на C# пытаюсь воспроизвести.

Кстати _http://help.solidworks.com/2012/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.iview~getfirstdisplaydimension5.html

Do not use IAnnotation::Visible property to modify this method's return value.

Ссылка на сообщение
Поделиться на других сайтах

Всё пашет, из цикла только надо выйти.

swView = (SolidWorks.Interop.sldworks.View)swDraw.GetFirstView();

			while ((swView != null))

			{

				string swYY = swView.GetName2();

				swDispDim = swView.GetFirstDisplayDimension5();

				if(swDispDim != null)

				{

					swAnn = swDispDim.IGetAnnotation();

					swDim = (Dimension)swDispDim.GetDimension();

					string swDimName = swDim.Name;

					if (swDimName == "RD1")

					{

						swAnn.Visible = (int)swAnnotationVisibilityState_e.swAnnotationHidden;

						break; //Приветы fox1001 с goto )))))))))

					}

					swDispDim = swDispDim.GetNext5();

				}

				swView = (SolidWorks.Interop.sldworks.View)swView.GetNextView();

			}
Заново пробегаясь по дименшнам прога уже не может найти скрытый размер. Тут надо либо код по другому писать, либо переносить полученные размеры на скрытый слой, или вообще удалять.
Ссылка на сообщение
Поделиться на других сайтах

Заново пробегаясь по дименшнам прога уже не может найти скрытый размер. Тут надо либо код по другому писать, либо переносить полученные размеры на скрытый слой, или вообще удалять.

вот странно что после запуска HideShowDimensions тоже размеры нельзя найти, как то их выделить програмно
Ссылка на сообщение
Поделиться на других сайтах

нужно как минимум знать его имя, это можно сделать перебором.

если имя известно, то можно и по имени размер выделить/получить:

Скрытый текст: код

If boolstatus = True Then

Set swDispDim = swSelMgr.GetSelectedObject5(1)

Set swAnnotation = swDispDim.GetAnnotation()

swAnnotation.Visible = CInt(swAnnotationVisibilityState_e.swAnnotationHidden)

swModel.WindowRedraw

swModel.ClearSelection2 False

End If linenums:0'>Set swApp = Application.SldWorks Set swModel = swApp.ActiveDoc Set swSelMgr = swModel.SelectionManager swModel.ClearSelection2 False Set swSheet = swModel.GetCurrentSheet boolstatus = swModel.Extension.SelectByID2("D1@Эскиз3" & "@" & swSheet.GetName, "DIMENSION", 0, 0, 0, False, 0, Nothing, 0) '???????? ?? If boolstatus = True Then Set swDispDim = swSelMgr.GetSelectedObject5(1) Set swAnnotation = swDispDim.GetAnnotation() swAnnotation.Visible = CInt(swAnnotationVisibilityState_e.swAnnotationHidden) swModel.WindowRedraw swModel.ClearSelection2 False End If

break; //Приветы fox1001 с goto )))))))))
нету в васике break, Exit While есть :bleh:

SW_Dim_Hide_Visible.zip

Ссылка на сообщение
Поделиться на других сайтах

NUMPL

Да не трогайте вы этот hideshow)))

Там всё просто :smile: Вот вам код отображения:

swView = (SolidWorks.Interop.sldworks.View)swDraw.GetFirstView();

			while ((swView != null))

			{

				object[] mySwAnnArr = (object[])swView.GetAnnotations();//получить все аннотации в object

				foreach (var curAnn in mySwAnnArr)

				{

					Annotation convAnn = (Annotation)curAnn; //преобразовать в Annotation

					int isVis = convAnn.Visible;

					if (isVis != 1)

					{

						string nameConvAnn = convAnn.GetName();

						if (nameConvAnn == "RD1")

						{

							convAnn.Visible = (int)swAnnotationVisibilityState_e.swAnnotationVisible;

						}

					}

				}
Ссылка на сообщение
Поделиться на других сайтах

NUMPL

Да не трогайте вы этот hideshow)))

Там всё просто :smile: Вот вам код отображения:

swView = (SolidWorks.Interop.sldworks.View)swDraw.GetFirstView();

			while ((swView != null))

			{

				object[] mySwAnnArr = (object[])swView.GetAnnotations();//получить все аннотации в object

				foreach (var curAnn in mySwAnnArr)

				{

					Annotation convAnn = (Annotation)curAnn; //преобразовать в Annotation

					int isVis = convAnn.Visible;

					if (isVis != 1)

					{

						string nameConvAnn = convAnn.GetName();

						if (nameConvAnn == "RD1")

						{

							convAnn.Visible = (int)swAnnotationVisibilityState_e.swAnnotationVisible;

						}

					}

				}
меня просто не хватает чтобы перевести это в VBA.....вот то что вы писали раньше, If swDim.FullName = "RD2@Чертежный вид1@312.Drawing" Then swAnn.Visible = swAnnotationVisibilityState_e.swAnnotationHidden.......да оно работает....находит размер и скрывает его....но когда размер уже скрыт, то его уже не находит.....в общем понял что буду переводить на скрытый слой и обратно....не могли бы вы сориентировать и ссылку на справку дать по перенесению на слои размеров и линий (не пойму просто, надо искать по layer или dimension или еще как то)...если макрос записывать и переносить на слой, то последовательность не записывается, почему-то
Ссылка на сообщение
Поделиться на других сайтах

в общем понял что буду переводить на скрытый слой и обратно...

в сообщении <noindex>#399</noindex> я для вас прикрепку с макросом на VBA сделал. не написал, что специально для вас, думал вы догадаетесь.

меня просто не хватает чтобы перевести это в VBA....

может тада лучше перейти на .net??? Convert C# to VB.NET - http://www.developerfusion.com/tools/convert/csharp-to-vb/
Ссылка на сообщение
Поделиться на других сайтах

в сообщении <noindex>#399</noindex> я для вас прикрепку с макросом на VBA сделал. не написал, что специально для вас, думал вы догадаетесь.

может тада лучше перейти на .net??? Convert C# to VB.NET - http://www.developerfusion.com/tools/convert/csharp-to-vb/

сейчас после обеда попробую, спасибо за участие) и streamdown тоже спасибо!
Ссылка на сообщение
Поделиться на других сайтах

меня просто не хватает чтобы перевести это в VBA

Да шож такое-то))))

Найти и скрыть:

Sub main()

	Dim swApp					   As SldWorks.SldWorks

	Dim swModel					 As SldWorks.ModelDoc2

	Dim swDraw					  As SldWorks.DrawingDoc

	Dim swView					  As SldWorks.View

	Dim swDispDim				   As SldWorks.DisplayDimension

	Dim swDim					   As SldWorks.Dimension

	Dim swAnn					   As SldWorks.Annotation

	Dim bRet						As Boolean

	

	Set swApp = Application.SldWorks

	Set swModel = swApp.ActiveDoc

	Set swDraw = swModel

	Set swView = swDraw.GetFirstView

	Do While Not swView Is Nothing

		Debug.Print "  View = " & swView.Name

		Set swDispDim = swView.GetFirstDisplayDimension5

		Do While Not swDispDim Is Nothing

			Set swAnn = swDispDim.GetAnnotation

			Set swDim = swDispDim.GetDimension

			   If swDim.Name = "RD2" Then

				  swAnn.Visible = swAnnotationVisibilityState_e.swAnnotationHidden

				  Exit Do

			   End If

			Set swDispDim = swDispDim.GetNext3

		Loop

		Set swView = swView.GetNextView

	Loop

End Sub

Найти и отобразить:

Sub main()

	Dim swApp					   As SldWorks.SldWorks

	Dim swModel					 As SldWorks.ModelDoc2

	Dim swDraw					  As SldWorks.DrawingDoc

	Dim swView					  As SldWorks.View

	Dim mySwAnnArr				  As Variant

	Dim curAnn					  As Variant

	Dim convAnn					 As Annotation

	Dim isVis					   As Integer

	

	Set swApp = Application.SldWorks

	Set swModel = swApp.ActiveDoc

	Set swDraw = swModel

	Set swView = swDraw.GetFirstView

	While Not swView Is Nothing

		mySwAnnArr = swView.GetAnnotations

		For Each curAnn In mySwAnnArr

		 Set convAnn = curAnn

		 If (convAnn.Visible <> 1) Then

		   Debug.Print "Имя размера: " & convAnn.GetName

		   If (convAnn.GetName = "RD2") Then

			convAnn.Visible = swAnnotationVisibilityState_e.swAnnotationVisible

		   End If

		 End If

		 Next curAnn

		Set swView = swView.GetNextView

	Wend

End Sub

Если будете продолжать программировать, поймите такую вещь: SW API для всех языков схожи. Просто смотрите по справке как это делается в других языках и пишите то же самое.

в общем понял что буду переводить на скрытый слой и обратно

Это я вам подсказал лишь пути решения, сами выбирайте понравившийся.

нету в васике break, Exit While есть

:clap_1:

Ссылка на сообщение
Поделиться на других сайтах

streamdown

Спасибо просто неимоверное)) Очень помогли, избавили от головной боли в такую хорошую погоду!!

Ссылка на сообщение
Поделиться на других сайтах

В честь весны!! :smile:

то последовательность не записывается, почему-то

Не все (да в принципе почти все) действия возможны при записи макроса.
Ссылка на сообщение
Поделиться на других сайтах
  • 3 недели спустя...

При добавлении компонентов в сборку с помощью функции AddComponent5(,.....)

он бросает детали в одну точку для точного расположения деталей рекомендуют использовать ITransform2 больше ничего конкретного в help не указано. Кто нибудь занимался этой проблемой?

Работаю на С++

Ссылка на сообщение
Поделиться на других сайтах

Здравствуйте, всех с праздником!! А подскажите пожалуйста как переместить активный вид на чертеже (задать его положение). Запись макроса не помогает. В справке пытался что-то по положению вида найти, не смог к сожалению. На VBA пишу.

Изменено пользователем NUMPL
Ссылка на сообщение
Поделиться на других сайтах

При добавлении компонентов в сборку с помощью функции AddComponent5(,.....)

он бросает детали в одну точку для точного расположения деталей рекомендуют использовать ITransform2 больше ничего конкретного в help не указано. Кто нибудь занимался этой проблемой?

Работаю на С++

Если правильно понял проблему.

P.S. Похоже, что с кодом я поторопился...

Изменено пользователем Shvg
Ссылка на сообщение
Поделиться на других сайтах

arrayData - это ориентация модели на экране, так ведь? При изменении вида модели, изменяется матрица. Её ж не посчитать при вставке в сборку. Можно только прикидочно расставить детальки, например горизонтально.

Хотяяя...можно попробовать преобразовать клик мыши в пространстве сборки и вставить origin

детали в это место. Скажите пожалуйста, я правильно понимаю эту IMathTransform?
Ссылка на сообщение
Поделиться на других сайтах

К вопросу об освоении Solidworks API. Возможно ли создать виндовое (Windows) приложение, которое будет, например, открывать файл сборки SLDASM и добавлять в него деталь из SLDPRT, сохранять результат по указанному пути, при этом не запуская графический интерфейс пользователя Solidworks? Можно ли создать приложение, которое будет делать то же самое с запуском Solidworks? В смысле запускаем exe'шник, открывается Solidworks, происходит какое-то колдунство, Solidworks закрывается, сборка изменена. Главное, чтобы эти действия происходили без участия пользователя, в том смысле, что пользователю не нужно самому запускать Solidworks, а в нём какой-то макрос.

Может ли кто-нибудь предоставить пример кода подобного приложения? Всё что мне удалось пока наделать после изучения <noindex>документации</noindex> это недо-Helloworld на C#.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;



namespace ConsoleApplication1

{

	class Program

	{

		static int Main(string[] args)

		{

			Console.WriteLine("Hello Solidwoks. ");



			// Ниже должна происходить Solidworks'ная магия. 

			SldWorks.SldWorks swAppl;		// Переменная... 

			swApp = new SldWorks.SldWorks(); // В которой мы храним наш экземпляр чего-то solidworks'ного

			swApp.ExitApp();				 // Который ничего не делает. 

			swApp = null;



			// Keep the console window open in debug mode.

			Console.WriteLine("Press any key to exit.");

			Console.ReadKey();



			// Everything is OK. 

			return 0;

		}

	}

}
Программа собирается и работает, но ничего Solidworks'ного не делает. Можете показать пример который хоть что-то делает?

При таком запуска Solid не запускаются Добавления(например simulation). Как запустить, чтоб сразу были загружены добавления на которых стоит галочка" запуск при загрузке solidworks"???

Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.
Примечание: вашему сообщению потребуется утверждение модератора, прежде чем оно станет доступным.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.




×
×
  • Создать...