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

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

Ура, заработало. С небольшими правками, вот рабочий код:

using System;

using System.Collections.Generic;

using System.Text;

using SolidWorks.Interop.sldworks;

using SolidWorks.Interop.swconst;



namespace ConsoleApplication1

{

	class Program

	{

		static int Main(string[] args)

		{

			Console.WriteLine("Hello Solidwoks console application. ");



			// Lets add some Solidworks functionality

			SldWorks.SldWorks swApp = new SldWorks.SldWorks(); // Создаём экземпляр солидворскного приложения. 

			if (swApp == null)								 // Завершаем работу программы если солид не стартовал. 

				return 1;									  // Solidworks not started properly. 

			//swApp.Visible = true;							// true - SW видим, false - невидим

			swApp.SendMsgToUser2("Привет, Solidworks! ", (int)swMessageBoxIcon_e.swMbInformation, (int)swMessageBoxBtn_e.swMbOk);

			swApp.ExitApp();								   // Закрываем Solidworks. 

			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 2010 SP4.0, Visual Studio 2010 Express.

Строчку с swApp.Visible я закомментировал, окно Solidworks'а на экран не выводится. Так что ответ на мой вопрос "Можно ли сделать консольное приложение которое что-то делает не запуская GUI Solidworks'а" -- да. В результате работы программы на экране появляется окно с сообщением "Привет, Solidworks!".

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


Ура, заработало. С небольшими правками, вот рабочий код:

...

Solidworks 2010 SP4.0, Visual Studio 2010 Express.

Строчку с swApp.Visible я закомментировал, окно Solidworks'а на экран не выводится. Так что ответ на мой вопрос "Можно ли сделать консольное приложение которое что-то делает не запуская GUI Solidworks'а" -- да. В результате работы программы на экране появляется окно с сообщением "Привет, Solidworks!".

Это хорошо, что заработало. А я тут 4 дня угробил: поставил VS2010 Prof и по-умолчанию поставил автоматом, там он мне кучу всего наворотил :gun_guns:

После этого половина сайтов перестала читаться... Пришлось восстанавливать системный раздел из образа...

Вы как устаноаку делали: выборочно или автоматом?

Я как-то ставил VS2008 Express и ничего не смог сделать с применением OpenGL :wallbash:

Даже примеры не смог запустить.

Поставил потом VS2010 Prof - OpenGL заработал (без относительно к SW), но SW2010 перестал вообще запускаться... Это было мес. 4 назад. А недавно вот то, что я выше сказал.

Загадки...

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

Вы как устаноаку делали: выборочно или автоматом?

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

Можно ли полноценно работать со всеми функциями solidworks на установленном Visual Studio 2010 Express? Будут ли поддерживаться все функции api solidworks на экспрессе?

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

Можно ли полноценно работать со всеми функциями solidworks на установленном Visual Studio 2010 Express? Будут ли поддерживаться все функции api solidworks на экспрессе?

Вопрос скорее к разработчикам "Visual Studio 2010 Express", чем к "SW".

Надо смотреть, чем отличаются "VS Express" от "Prof"...

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

Можно ли полноценно работать со всеми функциями solidworks на установленном Visual Studio 2010 Express? Будут ли поддерживаться все функции api solidworks на экспрессе?

Наскольо я знаю по VS2005 Express, то все функции SW поддерживаются.
Ссылка на сообщение
Поделиться на других сайтах

Есть приложение написанное на delphi (lazarus). Нужно передать число из программы в размер (как макрос леона recorddim). Может кто подсказать как реализовать OLE объект? (COM сервер не пашет в лазарусе)

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

Такой вопрос.

Создал макрос на основе записи. При попытке его же и воспроизвести - начинает ругаться Runtine error 91.

Создал эскиз-создал линию-изменил размер.

Вот код макроса с подсветкой ошибочной строки:

Dim swApp As Object

Dim Part As Object

Dim boolstatus As Boolean

Dim longstatus As Long, longwarnings As Long

Sub main()

Set swApp = _

Application.SldWorks

Set Part = swApp.ActiveDoc

Dim myModelView As Object

Set myModelView = Part.ActiveView

myModelView.FrameState = swWindowState_e.swWindowMaximized

Part.ClearSelection2 True

Dim skSegment As Object

Set skSegment = Part.SketchManager.CreateLine(0#, 0#, 0#, -0.037407, 0#, 0#)

Part.SetPickMode

Part.ClearSelection2 True

boolstatus = Part.Extension.SelectByID2("Line1", "SKETCHSEGMENT", -0.02462846783596, 1.331072749692E-04, 0, False, 0, Nothing, 0)

Dim myDisplayDim As Object

Set myDisplayDim = Part.AddDimension2(-0.01717446043769, -0.02036541307028, 0)

Part.ClearSelection2 True

boolstatus = Part.Extension.SelectByID2("D1@Эскиз1@Деталь24.SLDPRT", "DIMENSION", -0.01664203133781, -0.01717083847102, 0, False, 0, Nothing, 0)

Dim myDimension As Object

Set myDimension = Part.Parameter("D1@Эскиз1")

myDimension.SystemValue = 0.04

Part.ClearSelection2 True

Part.SketchManager.InsertSketch True

End Sub

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

Такой вопрос.

Создал макрос на основе записи. При попытке его же и воспроизвести - начинает ругаться Runtine error 91.

Создал эскиз-создал линию-изменил размер.

Вот код макроса с подсветкой ошибочной строки:

Что не так с изменением размера?

Вы вибираете размер:

boolstatus = Part.Extension.SelectByID2("D1@Эскиз1@Деталь24.SLDPRT", "DIMENSION", -0.01664203133781, -0.01717083847102, 0, False, 0, Nothing, 0)

т.е. "D1@Эскиз1@Деталь24.SLDPRT"

а потом пытаетесь присвоить новое значение размеру: ""

Part.Parameter("D1@Эскиз1")

Есть разница между "D1@Эскиз1@Деталь24.SLDPRT" и "D1@Эскиз1" ?

Вот например:

"

...

' "вытягиваем существующие размеры(параллелепипед)" - формируем правильное имя размера

TopName = swModel.GetTitle() ' имя текущего документа(здесь только для детали!)

dd1 = "D1@Эскиз1@" + TopName + ".SLDPRT" 'X

dd2 = "D2@Эскиз1@" + TopName + ".SLDPRT" 'Y

dd3 = "D1@Вытянуть1@" + TopName + ".SLDPRT" 'Z

' выбираем их по очереди и меняем значение

bs77 = swModel.Extension.SelectByID2(dd1, "DIMENSION", -0.01952646132365, 0.005280027677935, -0.01911822300454, False, 0, Nothing, 0)

swModel.Parameter("D1@Эскиз1").SystemValue = Val(Form1.Text1) / 1000 '0.06

bs88 = swModel.Extension.SelectByID2(dd13, "DIMENSION", -0.01952646132365, 0.005280027677935, -0.01911822300454, False, 0, Nothing, 0)

swModel.Parameter("D2@Эскиз1").SystemValue = Val(Form1.Text2) / 1000 '0.06

bs99 = swModel.Extension.SelectByID2(dd2, "DIMENSION", 0.03321508985329, -0.001978689415621, 0.003582492176178, False, 0, Nothing, 0)

swModel.Parameter("D1@Вытянуть1").SystemValue = Val(Form1.Text3) / 1000 '0.09

swModel.EditRebuild3 ' перестройка

...

"

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

а если не создавать промежуточные данные? Типа так:

bs77 = swModel.Extension.SelectByID2('D1@Эскиз1TopName.SLDPRT', "DIMENSION", -0.01952646132365, 0.005280027677935, -0.01911822300454, False, 0, Nothing, 0)

в этом случае выкидывает с ошибкой на OLE

Делаю всё через

swapp:=GetActiveOleObject('SldWorks.application');

не через макросы.

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

а если не создавать промежуточные данные? Типа так:

bs77 = swModel.Extension.SelectByID2('D1@Эскиз1TopName.SLDPRT', "DIMENSION", -0.01952646132365, 0.005280027677935, -0.01911822300454, False, 0, Nothing, 0)

в этом случае выкидывает с ошибкой на OLE

Делаю всё через

swapp:=GetActiveOleObject('SldWorks.application');

не через макросы.

Я такого не использовал вообще. Ничего не могу сказать по этому поводу.

Если первести: "получить активный OleObject".

"OLE (англ. Object Linking and Embedding, произносится как oh-lay [олэй]) — технология связывания и внедрения объектов в другие документы и объекты, разработанные корпорацией Майкрософт..."

Вы в курсе некоторой особенности синтаксиса VB:

если мы пишем так:

s1 = Sin(MyAngle) - аргумент д.б. в скобках

а если так:

Sin MyAngle - то без скобок

Еще,, когда вы пишите строку:

bs77 = swModel и дальше ставите точку, появляется ли выпадающий список возможных далее аргументов?

И вообще, у Вас неверно написанно имя размера:

надо так:

"D1@Эскиз1@Деталь24.SLDPRT"

а у Вас:

'D1@Эскиз1TopName.SLDPRT'

Знак @ пропущен и нужны двойные кавычки, а не одинарные.

Я так понял, что Вы в эскизе хотите нарисовать линию, проставить р-р, а затем изменить его?

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

а затем изменить его?

именно, и делаю так

Variant(swdoc).Extension.SelectByID2('Line4', 'SKETCHSEGMENT', -0.01477018581081, 0.05652787162162, 0, False, 0, n, 0);

Variant(swdoc).Extension.SelectByID2('Line6', 'SKETCHSEGMENT', -0.001276435810811, 0.053975, 0, True, 0, n, 0);

Variant(swdoc).AddDimension2(0.0180524, 0.0787743, 0); {Ставим между линиями размер}

Variant(swdoc).Extension.SelectByID2('D1@Эскиз1@GOO.SLDPRT', 'DIMENSION', 0.0180524, 0.0787743, 0, False, 0, 0, 0);

Variant(swdoc).Parameter('D1@Эскиз1').SystemValue:=0.005; {Задаем значение размера}
Ссылка на сообщение
Поделиться на других сайтах

это из другой ветки <noindex>http://fsapr2000.ru/index.php?showtopic=60...st&p=368453</noindex>

Спасибо всем.

К сожалению, эта выдержка актуальна только для Win32.

Будем разбираться. Непонятно, где нужно (и нужно ли) регистрировать COM-серверы в NET., который не использует реестр Windows.

Я думаю она актуальна и под .NET. Небольшой код на C# для add-ins.

using System;using System.Runtime.InteropServices;using System.Collections;using System.Reflection;// необходимо подключить эти библиотеки SWusing SolidWorks.Interop.sldworks;using SolidWorks.Interop.swpublished;using SolidWorks.Interop.swconst;using SolidWorksTools;///////////////////////////////////////using System.Collections.Generic;using System.Diagnostics;namespace MyComDll{    [Guid("7179B8B5-0CE3-4049-A4D9-D24992F7D71A"), ComVisible(true)] // атрибут регистрации COM-сервера    	   // атрибут регистрации в реестре HKEY_LOCAL_MACHINE\SOFTWARE\SolidWorks\AddIns. Для него и нужна библиотека SolidWorksTools.dll     [SwAddin(Description = "Shvg description", Title = "Shvg", LoadAtStartup = true)]           public class MyDll : ISwAddin // создаем класс-наследник интерфейса ISwAddin. Библиотека  SolidWorks.Interop.swpublished.dll    {        ISldWorks m_swApp = null;        int m_addinID = 0;	// далее две функции регистрации и нерегистрации в ветках реестра HKEY_LOCAL_MACHINE\SOFTWARE\SolidWorks\AddIns\	// и HKEY_СURRENT_USER\SOFTWARE\SolidWorks\AddInsStartup\        [ComRegisterFunctionAttribute]         public static void RegisterFunction(Type t)        {            #region Get Custom Attribute: SwAddinAttribute            SwAddinAttribute SWattr = null;            Type type = typeof(MyDll);            foreach (System.Attribute attr in type.GetCustomAttributes(false))            {                if (attr is SwAddinAttribute)                {                    SWattr = attr as SwAddinAttribute;                    break;                }            }            #endregion            try            {                Microsoft.Win32.RegistryKey hklm = Microsoft.Win32.Registry.LocalMachine;                Microsoft.Win32.RegistryKey hkcu = Microsoft.Win32.Registry.CurrentUser;                string keyname = "SOFTWARE\\SolidWorks\\Addins\\{" + t.GUID.ToString() + "}";                Microsoft.Win32.RegistryKey addinkey = hklm.CreateSubKey(keyname);                addinkey.SetValue(null, 0);                addinkey.SetValue("Description", SWattr.Description);                addinkey.SetValue("Title", SWattr.Title);                keyname = "Software\\SolidWorks\\AddInsStartup\\{" + t.GUID.ToString() + "}";                addinkey = hkcu.CreateSubKey(keyname);                addinkey.SetValue(null, Convert.ToInt32(SWattr.LoadAtStartup), Microsoft.Win32.RegistryValueKind.DWord);            }            catch (System.NullReferenceException nl)            {                Console.WriteLine("There was a problem registering this dll: SWattr is null. \n\"" + nl.Message + "\"");                //System.Windows.Forms.MessageBox.Show("There was a problem registering this dll: SWattr is null.\n\"" + nl.Message + "\"");            }            catch (System.Exception e)            {                Console.WriteLine(e.Message);                //System.Windows.Forms.MessageBox.Show("There was a problem registering the function: \n\"" + e.Message + "\"");            }        }        [ComUnregisterFunctionAttribute]        public static void UnregisterFunction(Type t)        {            try            {                Microsoft.Win32.RegistryKey hklm = Microsoft.Win32.Registry.LocalMachine;                Microsoft.Win32.RegistryKey hkcu = Microsoft.Win32.Registry.CurrentUser;                string keyname = "SOFTWARE\\SolidWorks\\Addins\\{" + t.GUID.ToString() + "}";                hklm.DeleteSubKey(keyname);                keyname = "Software\\SolidWorks\\AddInsStartup\\{" + t.GUID.ToString() + "}";                hkcu.DeleteSubKey(keyname);            }            catch (System.NullReferenceException nl)            {                Console.WriteLine("There was a problem unregistering this dll: " + nl.Message);            }            catch (System.Exception e)            {                Console.WriteLine("There was a problem unregistering this dll: " + e.Message);            }        }        #region ISwAddin Members                // соединяемся с SolidWorks при включении галки в списке Add-ins        public bool ConnectToSW(object ThisSW, int cookie)        {            m_swApp = (ISldWorks)ThisSW;            m_addinID = cookie;            m_swApp.SetAddinCallbackInfo(0, this, m_addinID);            System.Windows.Forms.MessageBox.Show("Connect To SolidWorks");            return true;        }                // разъединяемся с SolidWorks при отключении галки в списке Add-ins        public bool DisconnectFromSW()        {            m_swApp = null;            GC.Collect();            GC.WaitForPendingFinalizers();            GC.Collect();            GC.WaitForPendingFinalizers();            return true;        }        #endregion    }}

В настройках проекта VS необходимо поставить галку на Register for COM interop

P.S. Если это поможет, конечно.....

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

Да. Долгая работа Microsoft совместно с ЦРУ не прошла даром.

Они так умудрились запутать и себя и других, что и с бутылкой разобраться не просто.

Значит сборки NET. можно регистрировать в реестре как COM-сервер утилитой regasm (аналогично regsvr32), но лишь для связи с COM-клиентом.

Но, не означает ли это, что SW использует NET.-сборку как COM-сервер? Т.е. ему все-равно как выполнен этот сервер, как NET.-сборка или как обычная DLL? Лишь бы это был Inproc сервер, потому что, с другими типами COM-серверов SW не работает. Тогда SW загружает DLL, если это NET.-сборка, дополнительно грузится NET. framework и вызываются нужные функции. Но для чего тогда весь этот огород? Для совместимости с другими платформами? Что SW распространяется для многих платформ? Для увеличения инструментальных средств разработки программ? Наверно. Так как Microsoft навыпускала кучу средств для NET., нужно же их где-то использовать, даже если это сплошные накладные расходы (в случае с SW). Не будем говорить о надежности, хоть это тоже могло подразумеваться.

Может ли кто-нибудь подсказать, будет ли DLL со сборкой NET. грузиться в 64-разрядный процесс?

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

Может ли кто-нибудь подсказать, будет ли DLL со сборкой NET. грузиться в 64-разрядный процесс?

Будет. Во всяком случае под WinXPx64 нормально работала. Единственная проблема у меня была, это работа с базами данных. Я использовал в WinXPx32 Microsoft Access Driver (Microsoft.Jet.OLEDB.4.0). В чисто 64-разрядной такой фокус пока не прошел. И в примерах для SW в C# в свойствах проекта, закладка Build Events в поле Post Build Events Command Line вводят примерно такой текст

IF "$(TargetFrameworkVersion)"=="v4.0" GOTO NET40

IF "$(TargetFrameworkVersion)"=="v3.5" GOTO NET20

IF "$(TargetFrameworkVersion)"=="v3.0" GOTO NET20

IF "$(TargetFrameworkVersion)"=="v2.0" GOTO NET20

GOTO END



:NET40

set FMWK="v4.0.30319"

GOTO REG



:NET20

set FMWK="v2.0.50727"

GOTO REG



:REG

IF "$(PlatformName)" == "AnyCPU" GOTO ANYCPU

IF "$(PlatformName)" == "x64" GOTO X64

GOTO END



:ANYCPU

IF EXIST "%Windir%\Microsoft.NET\Framework64\%FMWK%\regasm.exe" "%Windir%\Microsoft.NET\Framework64\%FMWK%\regasm" /codebase "$(TargetPath)"

GOTO END



:X64

IF EXIST "%Windir%\Microsoft.NET\Framework64\%FMWK%\regasm.exe" "%Windir%\Microsoft.NET\Framework64\%FMWK%\regasm" /codebase "$(TargetPath)"

GOTO END



:END
P.S. О политике M$ я промолчу. Стаканов столько нету.....
Ссылка на сообщение
Поделиться на других сайтах

Этот текст я уже видел, но...

Кто-нибудь поможет найти хоть одно различие в последних двух секциях?

Мне это не удалось. Или я очень невнимателен, или ... опять политика.

Интересно, где можно вообще найти каталог Framework64 в системах, кроме 64-разрядных?

Тогда в них никогда EXIST-а и не будет ... а смысл? Для чего опять придумали этот огород?

Или SW x 32 и SW x 64 сделаны по разному?

Ну, на одно отличие я уже напоролся: они изменили кодировку своих надписей.

Вероятно есть и множество других ... ?!

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

Подскажите плз, в чём ошибка? см. скрин.

причём вид Развертка создаётся, но вываливает ошибку. sw2011sp1 x64

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

Подскажите плз, в чём ошибка? см. скрин.

причём вид Развертка создаётся, но вываливает ошибку. sw2011sp1 x64

В примере есть такое:

Set swView = swDraw.CreateFlatPatternViewFromModelView3( ...

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

ssv22

спасибо :worthy: Ночью надо спать, а не писать программы

хе-хе, "Ночью надо спать" и чтобы тебе снилась, что ты пишешь замечательную и правильную программу.. :rolleyes:
Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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

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

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

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

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

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

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




  • Сообщения

    • gudstartup
      вы тоже думаете что можно все компоненты чпу заменить и ничего не изменится и предупреждение о том чтобы oprminf не восстанавливали на другой машине которое фанук встроил даже в загрузчик это просто алармисткий текст и ничего не будет..... ну и ну и где написано что она mate как например здесь с чего тогда базовый чпу mate если гл.плата не mate мне непонятно из-за экрана что ли
    • статист
      Охренеть, ни за что бы не догадался. Хоть бы словом где обмолвились об этом в документации. Короче нужна команда EMODIF, E_ID, 3, N_ID где E_ID - номер элемента, который мы собираемся модифицировать. Так как используется BEAM188, то у него не два узла оказывается рассматривается, а три, где первые два принадлежат элементу, а третий узел - направляющий. И соответственно число 3 - это номер узла балки, который мы собираемся модифицировать, то есть направляющий узел. И мы этот узел соответственно заменяем на узел с номером N_ID. И тогда сечение реально вращается. Разобрался по этому видео.    
    • Александр1979
      Материнка такая в руководстве есть. На 0i-D я менял материнку, опции не слетели. 
    • gudstartup
      @Viktor2004 кстати конкретно модели автора в руководстве нет хотя оно последней редакции 18 года
    • Viktor2004
      конкретно на этой не менял. На каких менял, написал выше
    • gudstartup
      какие платы и на каких системах вот в чем ворос конкретно на этой возникут проблемы
    • Viktor2004
      ну да. А то что я менял платы это мои бредовые фантазии   Ну исправили в паспорте. И что?
    • gudstartup
      это догадки и гадание на кофейной гуще а япривожу документ где написано про то что прочитайте пункт 4.11 а там представляете вот что 4) Замена печатной платы может привести к изменению идентификационного номера ЧПУ. Проверьте это на Экран ЧПУ. Если оно отличается от описанного в техническом паспорте, исправьте его.  
    • Viktor2004
      я менял все платы. И на форуме наверное не я один их менял. И никто еще не писал что при этом у него слетел сертификат Возможно ID номера проверяются только в момент установки опции, а когда они уже установлены и мирно хранятся в OPRM INF возможно ти уже на ID наплевать
    • gudstartup
      для кого это написано CAUTION Before replacing a printed circuit board, be sure to read Section 4.11, “OPTION INFORMATION FILE” to confirm the procedure.  
×
×
  • Создать...