Jump to content

Первые шаги в мир программирования под nanoCAD


Recommended Posts

Подскажите пожалуйста будет ли это реализовано в платформе в обозримом будущем?

 

 

post-64306-0-19947100-1516352714.png

 

 

Link to comment
Share on other sites

поясню зачем это надо:

методом server.query невозможно получить коллекцию только "Универсальных маркеров", невозможно сделать выборку с определенных слоев

этот метод работает только на активном пространстве, т.е. с неактивной вкладки или документа коллекцию этим методом не получить.

все эти задачи и многие другие прекрасно решаются методом SelectionSets платформы, но в патформе не реализован механизм передачи указателя на объект между нанокад и МсСом

Link to comment
Share on other sites

поясню зачем это надо:

методом server.query невозможно получить коллекцию только "Универсальных маркеров", невозможно сделать выборку с определенных слоев

этот метод работает только на активном пространстве, т.е. с неактивной вкладки или документа коллекцию этим методом не получить.

все эти задачи и многие другие прекрасно решаются методом SelectionSets платформы, но в патформе не реализован механизм передачи указателя на объект между нанокад и МсСом

За COM не знаю на .NET можно, через .ID.ToOldIdPtr() потом из него получить ObjectId, вот как получить handle в MC не нашел.

  • Like 1
Link to comment
Share on other sites

Этот код отрабатывает в AutoCad и не работает в NanoCAD (не реализовано)

 

 


Public ThisDrawing As Object
Sub method_not_implemented_under_this_platform()
Dim intType(0) As Integer '(2)
Dim varDat(0)  As Variant
Dim objSelSet  As Object
Dim objNanoCAD As Object
'<Сбор таблиц селсетом
   Set spds = CreateObject("McCOM2.Server")
On Error Resume Next
   Set objNanoCAD = GetObject(, "AutoCAD.Application")
   If Err.Number <> 0 Then
    Err.Number = 0
    Debug.Print Err.Number
    Set objNanoCAD = GetObject(, "NanoCAD.Application")
    If Err.Number <> 0 Then
	    MsgBox "Не запущен CAD"
	    Exit Sub
    End If
   End If
On Error GoTo 0
   Set ThisDrawing = objNanoCAD.ActiveDocument
   intType(0) = 0
   varDat(0) = "spdstable2" 'таблицы СПДС от 8,0 и младше, за СПДС 11, 12 не скажу _
   старые версии СПДС, старше 8,0 "spdstable"
   Set objSelSet = vbdPowerSet("seTEST")
   objSelSet.Select 5, , , intType, varDat
   Debug.Print "spdstable-" & objSelSet.Count
Dim objAK As Object
Dim ObjMC As Object
   For Each objAK In objSelSet
    Set ObjMC = spds.Object(objAK) 'имеем полный доступ к свойствам СПДС в АК но в нане "method not implemented under this platform"
    namee = ObjMC("Name")
   'или
    nameeee = ObjMC!Name
    Debug.Print "Имя таблицы-" & namee
   'работаем с ним дальше
   Next
End Sub
Public Function vbdPowerSet(strName As String) As Object 'AcadSelectionSet
Dim objSelSet As Object ' AcadSelectionSet
Dim objSelCol As Object ' AcadSelectionSets
   Set objSelCol = ThisDrawing.SelectionSets
   For Each objSelSet In objSelCol
    If objSelSet.Name = strName Then
	    objSelSet.Delete
	    Exit For
    End If
   Next
   Set objSelSet = ThisDrawing.SelectionSets.Add(strName)
   Set vbdPowerSet = objSelSet
End Function

 

 

Link to comment
Share on other sites

  • 6 months later...

Здравствуйте!

Переходим всей организацией на нанокад. В связи с чем возникает несколько вопросов.

В принципе функционал "Геоники" устраивает, но остались достаточно нужные полезные лиспы с автокадовских времен (корректно работают под версии 2004, 2007, 2010 но уже не все)

В нанокаде не работает полноценно никакой из них. например функция не определена ENAME , MODES,ошибка в функции *error* наверная функция и тому подобное.

Насколько я смог узнать не все лисп функции автокада есть в нанокаде. Проблема в этом?

 

Либо я что то не подгрузил. Например согласно учебнику Н.Полещука в автокаде для работы грузятся функции activX

Вот такой код предшествует подгрузке других лиспов при работе в автокад.

 

;***БАЗОВАЯ ФУНКЦИЯ ДОСТУПА К ТЕХНОЛОГИИ ActiveX

; Глобальные переменные:

; acad_application-указатель корневого объекта иерархии AutoCAD

; active_document-указатель открытого документа

; model_space-указатель пространства модели рисунка

; paper_space-указатель пространства листа документа

(DEFUN begin_actvex ( /)

(vl-load-com)

(setq acad_application(VLAX-GET-ACAD-OBJECT))

(setq active_document(VLA-GET-ACTIVEDOCUMENT acad_application))

(setq model_space(vla-get-modelspace active_document))

(setq paper_space(vla-get-paperspace active_document))

);end

;---------

 

(begin_actvex )

 

Нужен ли код подобного плана для нанокад?

Либо подгрузка библиотек каких либо?

Или может проще эти лиспы переписать под с++? он более функционален? и в принципе как выбрать язык под себя и свои задачи?

Нанокад версии 8.5

 

P.S. Не программист (но ручки тянутся разбираться), новичок, энтузиаст.

Link to comment
Share on other sites

Насколько я смог узнать не все лисп функции автокада есть в нанокаде. Проблема в этом?

не все. от версии к версии поддержка LISP растет.

Или может проще эти лиспы переписать под с++? он более функционален? и в принципе как выбрать язык под себя и свои задачи?

по этому куску вырванного из контекста, не понятно, что там проще или сложнее.

по языкам ИМХО:

LISP - кроме автокад/нанокад, почти нигде не понадобиться. и поддержка в нано его насколько понимаю, еще далека от автокад.для староверов и любителей функционального программирования.

Jscript/vbscript - весело и просто. для начинающих норм. не все есть правда. для небольших скриптов и быстрого прототипирования.

C#/MultiCAD/.NET - серъезный инструмент с большими возможностями. порог входа - выше чем в предыдущем. Для полноценных приложений.

C++ - this party is hard. планируете разрабатывать высокопроизводительные промышленные приложения? - Вам сюда. Высокий порог входа. для настоящих джедаев.

  • Like 4
Link to comment
Share on other sites

Спасибо за ответ, стало понятнее в какую сторону смотреть! Судя по всему на с++ замахиватся не стоит.

 

Однако про входной лисп (по аналогии с тем что был в сообщении выше) вопрос остался открыт. Нужен ли он в подобном виде для нано?Или все должно работать так?

Лисперы отзовитесь=)

Link to comment
Share on other sites

  • 8 months later...

Если у кого-то есть в электроннном виде книги по программированию до Windows CE или по программированию под Windows с использованием MFC, поделитесь, пожалуйста.

Link to comment
Share on other sites

Если у кого-то есть в электроннном виде книги по программированию до Windows CE или по программированию под Windows с использованием MFC, поделитесь, пожалуйста.

здесь как бы форум совсем не про форум. литературы по общесистемному программированию, огромное кол-во в т.ч. в свободном доступе.

так что чем могу, полезная ссылка ниже)

 

_http://g.zeos.in/?q=Windows%20CE%20programming%20books

Link to comment
Share on other sites

  • 3 weeks later...

Добрые люди, есть ли у кого програмка под нано или лисп для объединения штриховок?

Нашёл пару лиспиков в сети, но нано их не хочет запускать корректно.

Пользуюсь Нанокад СПДС 6.0

Link to comment
Share on other sites

  • 3 months later...

всем доброе утро. никогда ранее не делал ничего под нано-кад, да и сам продукт увидел впервые два дня назад. но интерес есть. хочу попробовать. с чего начать? есть: сам нано-кад, МС вижуал студия 2017, опыт написания .NET сборок для автокада, опыт работы с ObjectARX. как оказалось этого мало. даже начать не могу. код для автокада тут не работает.

помогите с быстрым стартом плиз.

Link to comment
Share on other sites

Есть SDK, его можно получить, зарегистрировавшись в Клубе разработчиков. Там же можно получить бессрочную лицензию для разработки на 3 машины.

В SDK есть скромные примеры на всех поддерживаемых языках.

Edited by Kreator
  • Like 1
Link to comment
Share on other sites

Если есть опыт писания под AutoCad то трудностей быть не должно. Расположение/назначение классов, методов и т. д. очень схожи.

 

Ниже инфа от 2014 года, но возможно еще актуальна:

Здесь я писал где я искал инфу (в том числе SDK который устанавливается на ПК + доступен на фопуме разработчиков)

http://forum.nanocad...indpost&p=28401

 

Даю для примера куски кода на C# (код не идеален, но для примера думаю сойдет)

подключения к нанокаду

		/// <summary> запуск и связь с Nanocad
		///
		/// </summary>
		/// <returns></returns>
		public static nanoCAD.Application nanocad_service_run()
		{
			nanoCAD.Application nc_app = null;
			try
			{
				object processSW = System.Activator.CreateInstance(System.Type.GetTypeFromProgID("NanoCad.Application"));
				nc_app = (nanoCAD.Application)processSW;
			}
			catch
			{
				nc_app = new nanoCAD.Application();
			}
			if (nc_app.Documents.Count == 0)
			{
				nc_app.Documents.Add(@"c:\Program Files (x86)\Nanosoft\nanoCAD en 5.0\UserDataCache\Templates\Default.dwt");
			}
			return nc_app;
		}

 

Контур форматки А4 на активном документе

	    /// <summary> контур А4 на активном документе
		///
		/// </summary>
		public static void nanocad_risuem_A4_kontur(nanoCAD.Application nc_app)
		{
			double[] point1 = { 0, 0, 0 }, point2 = { 0, 297, 0 }, point3 = { 210, 297, 0 }, point4 = { 210, 0, 0 };
			double[] point10 = { 20, 5, 0 }, point20 = { 20, 297 - 5, 0 }, point30 = { 210 - 5, 297 - 5, 0 }, point40 = { 210 - 5, 5, 0 };
			OdaX.AcadLine default_line = nc_app.ActiveDocument.ModelSpace.AddLine(point1, point2); default_line.LinetypeScale = 1; default_line.Lineweight = OdaX.ACAD_LWEIGHT.acLnWt000; default_line.Linetype = nc_app.ActiveDocument.Linetypes.Item(2).Name;
			default_line = nc_app.ActiveDocument.ModelSpace.AddLine(point2, point3); default_line.LinetypeScale = 1; default_line.Lineweight = OdaX.ACAD_LWEIGHT.acLnWt000; default_line.Linetype = nc_app.ActiveDocument.Linetypes.Item(2).Name;
			default_line = nc_app.ActiveDocument.ModelSpace.AddLine(point3, point4); default_line.LinetypeScale = 1; default_line.Lineweight = OdaX.ACAD_LWEIGHT.acLnWt000; default_line.Linetype = nc_app.ActiveDocument.Linetypes.Item(2).Name;
			default_line = nc_app.ActiveDocument.ModelSpace.AddLine(point4, point1); default_line.LinetypeScale = 1; default_line.Lineweight = OdaX.ACAD_LWEIGHT.acLnWt000; default_line.Linetype = nc_app.ActiveDocument.Linetypes.Item(2).Name;
			default_line = nc_app.ActiveDocument.ModelSpace.AddLine(point10, point20); default_line.LinetypeScale = 1; default_line.Lineweight = OdaX.ACAD_LWEIGHT.acLnWt030; default_line.Linetype = nc_app.ActiveDocument.Linetypes.Item(2).Name;
			default_line = nc_app.ActiveDocument.ModelSpace.AddLine(point20, point30); default_line.LinetypeScale = 1; default_line.Lineweight = OdaX.ACAD_LWEIGHT.acLnWt030; default_line.Linetype = nc_app.ActiveDocument.Linetypes.Item(2).Name;
			default_line = nc_app.ActiveDocument.ModelSpace.AddLine(point30, point40); default_line.LinetypeScale = 1; default_line.Lineweight = OdaX.ACAD_LWEIGHT.acLnWt030; default_line.Linetype = nc_app.ActiveDocument.Linetypes.Item(2).Name;
			default_line = nc_app.ActiveDocument.ModelSpace.AddLine(point40, point10); default_line.LinetypeScale = 1; default_line.Lineweight = OdaX.ACAD_LWEIGHT.acLnWt030; default_line.Linetype = nc_app.ActiveDocument.Linetypes.Item(2).Name;
		}

Edited by Александр_
  • Like 1
Link to comment
Share on other sites

вот это уже что-то, спасибо. но больше интересует создание .NET DLL для загрузки из самого ПО. кое что уже получилось... но сюда даже код не могу вставить, странный интерфэйсл у форума....

Link to comment
Share on other sites

для начала, хотя бы, какие DLL подключать к сборке? видел ряд примеров, подключают файлы host* и mapi*. Там типа два фреймвока? Teigha и Multicad? по крайней мере вижу два namespace.

Link to comment
Share on other sites

но сюда даже код не могу вставить, странный интерфэйсл у форума....

Почему же нельзя? Вон сверху кнопочка Код, а в спойле можно спрятать тэгом [ spoiler ] [ / spoiler ]

 

 

using Something;
HelloWorld();

 

 

 

для начала, хотя бы, какие DLL подключать к сборке? видел ряд примеров, подключают файлы host* и mapi*. Там типа два фреймвока? Teigha и Multicad? по крайней мере вижу два namespace.

Для начала, откройте любой пример из входящих в состав, посмотрите, что там и как. У меня подключены mapi*, host* мне не нужен :) Да, mapi - Multicad API.

 

вот это уже что-то, спасибо. но больше интересует создание .NET DLL для загрузки из самого ПО. кое что уже получилось

Что имеете в виду? По результату получается DLL, которую можно загрузить в NC командой NETLOAD или прописать в автозагрузку. DLL должна быть на локальном диске - на всякий случай.

Link to comment
Share on other sites

у меня есть некоторые проблемы скачать SDK. ну и соответственно примеров нет. можете список DLL дать которые подключаем для MultiCAD и отдельно который для Teigha? эти фреймвоки взаимозаменяемы?

Link to comment
Share on other sites

у меня есть некоторые проблемы скачать SDK. ну и соответственно примеров нет. можете список DLL дать которые подключаем для MultiCAD и отдельно который для Teigha? эти фреймвоки взаимозаменяемы?

 

Это разные API, хотя много в чем пересекаются. MultiCAD более высокоуроневое API как я понимаю. на нем быстрее писать , некоторые задачи.

 

MultiCAD:

- mapimgd.dll,

- mapibasetypes.dll

Teiga:

- hostmgd.dll

- hostdbmgd.dll

 

может это будет полезным комментарием.

_https://habr.com/ru/company/nanosoft/blog/184482/#comment_6468390

 

P.S. Кто бы написал статью про API , чего там откуда наследуюется и чего под капотом и какие API есть в nanoCAD и чем они отличаются. сходу действительно не очень то понятно.

Edited by Ivanco
Link to comment
Share on other sites

ну ладно мультикад это российская разработка, нет документации, не могу это понять, но могу это простить. но тейга то!? это же вполне отдельный продукт! нету доки?

Link to comment
Share on other sites

вроде как с тайгой освоился. namespace отличаются, а в остальном, копия autocad.net API.

вот такой фрагмент заработал:

using System;

using Teigha.DatabaseServices;

using Teigha.Runtime;

using Teigha.Geometry;

using HostMgd.ApplicationServices;

class c1

{

static Action<string> wl = Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage;

static Database b = HostApplicationServices.WorkingDatabase;

[CommandMethod("q1")]

static public void q1()

{

Application.ShowAlertDialog("677");

wl("start");

var pl = new Polyline();

pl.AddVertexAt(0, new Point2d(0, 0), 0, 1, 1);

pl.AddVertexAt(1, new Point2d(100, 0), 0, 1, 1);

pl.AddVertexAt(1, new Point2d(100, 100), 0, 1, 1);

using (var t = b.TransactionManager.StartTransaction())

{

(b.CurrentSpaceId.GetObject(OpenMode.ForWrite) as BlockTableRecord).AppendEntity(pl);

t.AddNewlyCreatedDBObject(pl, true);

t.Commit();

}

wl("finish");

}

}

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Tell a friend

    Love Официальный форум компании Нанософт? Tell a friend!
×
×
  • Create New...