Jump to content

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


Recommended Posts

Хорошо, а как правильно задать массив?

Что бы возвратить тоже массив

 

Потому что такая конструкция выдает ошибку: "Expected )"

Public Function CenterArc3point(pt1(2) As Double, pt2(2) As Double, pt3(2) As Double) As Double

Уберите двойки

 

Двойки я уберу, но тогда опять возвращаемся к данному посту: http://forum.nanocad.ru/index.php?showtopic=3182&view=findpost&p=29760

А мне нужно задать массив и вернуть массив.

Link to comment
Share on other sites

Хорошо, а как правильно задать массив?

Что бы возвратить тоже массив

 

Потому что такая конструкция выдает ошибку: "Expected )"

Public Function CenterArc3point(pt1(2) As Double, pt2(2) As Double, pt3(2) As Double) As Double

Уберите двойки

 

Двойки я уберу, но тогда опять возвращаемся к данному посту: http://forum.nanocad...indpost&p=29760

А мне нужно задать массив и вернуть массив.

As Double()

 

Sub mcr0()

 

Dim m1() As Double

ReDim m1(2)

m1(0) = 0#

m1(1) = 0.1

m1(2) = 0.2

 

Dim m2() As Double

 

m2() = mcr1(m1)

 

End Sub

 

 

Function mcr1(m1() As Double) As Double()

 

m1(0) = m1(0) + 0.1

m1(1) = m1(1) + 0.1

m1(2) = m1(2) + 0.1

 

mcr1 = m1()

 

End Function

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

А ещё справку полистайте по VBA. На MSDN и на бесчисленных форумах есть куча статей, в том числе на русском, где разобраны многие нюансы, характерные именно для VBA.

В данном случае исправив первую ошибку, получили вторую - нельзя передавать в VBA массивы с явно указанным размером. Отсюда и ошибка - компилятор ждёт вторую скобку сразу за первой, а там у нас число. В скобках именно размерность массива. Убрать двойки - это не убрать скобки. Т.е. скобки оставляем, но в них пусто. Этим мы передаём массив без указанной размерности. Т.е. функция не будет знать, сколько элементов в массиве. Но мы знаем, что их 3.

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

Link to comment
Share on other sites

А ещё справку полистайте по VBA. На MSDN и на бесчисленных форумах есть куча статей, в том числе на русском, где разобраны многие нюансы, характерные именно для VBA.

В данном случае исправив первую ошибку, получили вторую - нельзя передавать в VBA массивы с явно указанным размером. Отсюда и ошибка - компилятор ждёт вторую скобку сразу за первой, а там у нас число. В скобках именно размерность массива. Убрать двойки - это не убрать скобки. Т.е. скобки оставляем, но в них пусто. Этим мы передаём массив без указанной размерности. Т.е. функция не будет знать, сколько элементов в массиве. Но мы знаем, что их 3.

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

 

Спасибо.

Link to comment
Share on other sites

Всем привет. Подскажите пожалуйста, как поочередно активировать открытые документы?

 

Таким способом получаю количество открытых документов

int i = 0;
var objNanoCADApp = new nanoCAD.Application();
i = objNanoCADApp.Documents.Count;

но доступа к другим объектам я не нашел ни в Documents ни в Document.

 

Уточню. В VBA это выгляди так:

 

Dim app As nanoCAD.Application
Set app = GetObject("", "nanoCAD.Application")
Dim ThisDrawing As nanoCAD.Document
For i = 1 To app.Documents.Count
app.Documents.Item(i).Activate
Set ThisDrawing = app.ActiveDocument
'тут делаем все что надо с документом
Next i

 

Как сделать то же самое в C# ?

 

var objNanoCADApp = new nanoCAD.Application();
for (int ki = 0; ki < objNanoCADApp.Documents.Count; ki++ )
{
// что сюда вставить что бы переключится на документ ki ?
var ThisDrawing = objNanoCADApp.ActiveDocument;
// что бы здесь сделать с документом некоторые действия.
}

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

Попробуйте так:

objNanoCADApp.Documents[ki].Activate();

Спасибо. Помогло.

Сразу правда вылезло предупреждение "Неоднозначность между методом "nanoCAD.InanoCADDocument.Activate()" и "nanoCAD._DnanoCADDocumentEvents_Event.Activate", который методом не является. Используйте группу методов."

Поэтому сделал так: (может кому пригодится)

var objNanoCADApp = new nanoCAD.Application();
for (int ki = 1; ki < objNanoCADApp.Documents.Count+1; ki++ )
{
nanoCAD.InanoCADDocument ddd;
ddd = objNanoCADApp.Documents[ki];
ddd.Activate();
var ThisDrawing = objNanoCADApp.ActiveDocument;
// здесь некоторые действия
}

Link to comment
Share on other sites

  • 2 weeks later...

Добрый день!

Вернулся к разработке утилитки для NanCAD-а под Deplhi (версия 2009), Win7 x64 и столкнулся с такой проблемой:

после получения объекта приложения

ovnanoCAD := GetActiveOleObject('nanoCad.Application');

попытка привести переменную к типу

Result := IDispatch(ovnanoCAD) as InanoCADApplication;

вызывает ошибку "Interface not supprorted".

Подскажите, в какую сторону копать?

Link to comment
Share on other sites

Привет...Спасибо за тему...Зашел чисто случайно...Зацепило буду побывать мутить что то под nanoCAD

Link to comment
Share on other sites

  • 1 month later...

Всем привет. Пытаюсь получить координату точки. Нашел здесь http://forum.nanocad.ru/index.php?showtopic=3182&view=findpost&p=14430 как это сделать. Пробую на C# ничего не получается. Пишет "Разрушительный сбой (Исключение из HRESULT: 0x8000FFFF (E_UNEXPECTED))".

 

public nanoCAD.Application nc_app = new nanoCAD.Application();
public nanoCAD.Document nc_doc;
private void button3_Click(object sender, EventArgs e)
    {
	    nc_doc = nc_app.ActiveDocument;
	    var point_a = nc_app.Utility.CreateSafeArrayFromVector(nc_app.Utility.GetPoint("0,0,0", "Укажите точку"));
    }

 

Подскажите, что я делаю не так?

Link to comment
Share on other sites

Поясните пожалуйста, что такое "вес команды" (weight) в конфигурационном файле nCAD.cfg ?

Edited by shoorup
Link to comment
Share on other sites

вес команды это такая штука... в общем, работает это примерно так : бежит какая-то команда, с весом W1. в этот момент мы откуда-нибудь (например из меню, из тулбара, еще бог весть откуда) запускаем другую команду. с весом W2. если W2 >= W1, то вторая команда вышибает первую и запускается сама. а если W2

Link to comment
Share on other sites

Под "вышибает" это отменит, закроет? или приостановит на время выполнения W2?

Ну впринципе понятно. Практикой только закрепить.

Вобщем "weight" можно одним словом описать - "приоритет". Так?

Link to comment
Share on other sites

  • 2 weeks later...

Вынужден повторить вопрос, ответа пока не нашел.

На vba все работает.

Sub NANO()
Dim app As nanoCAD.Application
Set app = GetObject("", "nanoCAD.Application")
app.Visible = True

Dim ut As nanoCAD.Utility
Set ut = ThisDrawing.Utility
Dim pp As Variant
pp = ut.GetPoint("0", "Point !")
Dim st As String
st = pp(0) & " : " & pp(1) & " : " & pp(2)
MsgBox (st)
End Sub

 

На C# ошибка "разрушительный сбой" в GetPoint

		var nc_ = new nanoCAD.Application();
		nc_.Visible = true;
		Utility nc_util = nc_.Utility;
		double[] point = { 0, 0, 0 };
		string promt = "Point !";
		point = nc_util.GetPoint("0", promt);

Что не так?

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

  • 2 weeks later...

Доброго времени суток!

Начинаю программировать для Nanocad, делаю первое приложение на MultiCAD в VisualStudio.

Сделал все согласно статье SDK "Создание нового проекта (MultiCAD.NET API)": в VisualStudio создал Class Library, добавил в references mapimgd.dll, текст cs-файла сделал таким:

using Multicad.Runtime;
using Multicad.Geometry;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace ClassLibrary2
{    
   public class Class1
   {
       [CommandMethod("Example1")]
       public void Template1()
       {
           MessageBox.Show ("hello");
           //Point3d pt1 = new Point3d(0, 0);
       }
   }
}

Подгрузил в Nanocad файл ClassLibrary2.dll, ошибок не было. Но команды под именем Example1 Nanocad почему-то не знает :(

Помогите новичку!

Link to comment
Share on other sites

  • 2 weeks later...

Доброго времени суток!

Начинаю программировать для Nanocad, делаю первое приложение на MultiCAD в VisualStudio.

Сделал все согласно статье SDK "Создание нового проекта (MultiCAD.NET API)": в VisualStudio создал Class Library, добавил в references mapimgd.dll, текст cs-файла сделал таким:

using Multicad.Runtime;
using Multicad.Geometry;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace ClassLibrary2
{	
public class Class1
{
	[CommandMethod("Example1")]
	public void Template1()
	{
		MessageBox.Show ("hello");
		//Point3d pt1 = new Point3d(0, 0);
	}
}
}

Подгрузил в Nanocad файл ClassLibrary2.dll, ошибок не было. Но команды под именем Example1 Nanocad почему-то не знает :(

Помогите новичку!

Скорее всего версия .Net Framework нито стоит у вас. Надо .Net Framework 3.5

  • Like 1
Link to comment
Share on other sites

  • 1 month later...

в с# и MultiCAD новичок.

Написал/взял из статей на хабре такое:

 public class SocketTableSample
 {
  [CommandMethod("summ_all_table", CommandFlags.NoCheck | CommandFlags.NoPrefix)]
  public void summ_all_table()
   {
 // Выбор всех объектов типа "таблица"
 McObjectId[] idSelecteds = ObjectFilter.Create(true).AddType(McTable.TypeID).GetObjects().ToArray();

  if (idSelecteds == null || idSelecteds.Length == 0)
  {
    MessageBox.Show("Объекты не выбраны");
    return;
  }
  for (int i = 0; i < idSelecteds.Length; i++)
  {
  McTable outObj = McObjectManager.GetObject(idSelecteds[i]);
  outObj.ExportToExcel();
  }
  }
 }
}

компилируется и работает норм.но метод ExportToExcel() для каждой таблицы создает новую книгу Exel.Мне нужно чтобы каждая таблица чертежа экспортировалась в новый лист одной книги, т.е. 10 таблиц в чертеже = 1 книга с 10 листами Exel.

подскажите пожалуйста как это реализовать? средствами MultiCAD это возможно?

Link to comment
Share on other sites

  • 3 weeks later...

может кто подскажет как на другом языке сделать? (см.пост выше). Суть вопроса - нужно все таблицы из .dwg файла(пространство модели) перекинуть в одну Excel книгу, но на разные листы.

Link to comment
Share on other sites

компилируется и работает норм.но метод ExportToExcel() для каждой таблицы создает новую книгу Exel.Мне нужно чтобы каждая таблица чертежа экспортировалась в новый лист одной книги, т.е. 10 таблиц в чертеже = 1 книга с 10 листами Exel.

подскажите пожалуйста как это реализовать? средствами MultiCAD это возможно?

public bool ExportToExcel(ref String strPath);

Пробовали указать путь один и тот же? Проверить не могу, у меня Excel'я нет.

Link to comment
Share on other sites

  • 2 weeks later...
Пробовали указать путь один и тот же? Проверить не могу, у меня Excel'я нет.

outObj.ExportToExcel( @"C:\1.xlsx");

так? не работает..компилируется,но при выполнении в нано Exel "падает".

Edited by Ivanco
Link to comment
Share on other sites

outObj.ExportToExcel( @"C:\1.xlsx");

так? не работает..компилируется,но при выполнении в нано Exel "падает".

Там ref указан, надо передать не значение, а переменную по ссылке:

string s1; 
s1="c:\1.xls";
...(ref s1);

Link to comment
Share on other sites

  • 2 weeks later...
Там ref указан, надо передать не значение, а переменную по ссылке

public string a = @"C:\1.csv";
outObj.SaveToFile(a);

вот так работает, но т.к. я массив(см.выше) в цикле обхожу ,получается что у меня каждая таблица файл переписывает, а мне нужно как то добавлять/дописывать в файл.

как это сделать?

public bool SaveToFile(ref String fileName, IntPtr hParent);

вот такое еще в описании API нашел - незнаю что это- теоретических знаний мало(.

___________

решено:http://forum.nanocad.ru/index.php?showtopic=6881&view=findpost&p=33417

Edited by Ivanco
Link to comment
Share on other sites

public string a = @"C:\1.csv";
outObj.SaveToFile(a);

вот так работает, но т.к. я массив(см.выше) в цикле обхожу ,получается что у меня каждая таблица файл переписывает, а мне нужно как то добавлять/дописывать в файл.

как это сделать?

public bool SaveToFile(ref String fileName, IntPtr hParent);

вот такое еще в описании API нашел - незнаю что это- теоретических знаний мало(.

Как вариант, можно файлы сохранять отдельно с индексами, а потом подключиться к Excel и уже его средствами (через его API) все листы перенести в один файл.

Может разработчики чего умнее подскажут. Кстати, попробуйте в клубе разработчиков спросить, там все вопросы касаемо API и правильности применения функций разъяснят.

Link to comment
Share on other sites

может кто подскажет как на другом языке сделать? (см.пост выше). Суть вопроса - нужно все таблицы из .dwg файла(пространство модели) перекинуть в одну Excel книгу, но на разные листы.

на другом языке VBA

это кусок кода, но смысл думаю понятен

 


'цепляемся к эксель
ФлагExcel = 0
On Error Resume Next 'проверочка запущени ли Excel
	Set objExcel = GetObject(, "Excel.Application")
	If Err.Number <> 0 Then
		Set objExcel = CreateObject("Excel.Application")
		objExcel.Workbooks.Add
		ФлагExcel = 1
	End If
On Error GoTo 0

'имя нового листа
sListName = "Отчет за " & Date$
On Error Resume Next
'	добавляем лист
	objExcel.Worksheets.Add.Name = sListName
	If Err.Number <> 0 Then  'лист уже есть
		On Error GoTo 0
		objExcel.ActiveWorkbook.ActiveSheet.Delete 'мочим созданный
		objExcel.ActiveWorkbook.Sheets(sListName).Select  'переходим на наш
	End If
objExcel.Visible = 1
objExcel.DisplayAlerts = False 'отрубаем алерт
'***************************************
'в цикле формируем массива для Excel

iТемп = 1
For Each Маркер In МаркерСпец
'  !!!! добавить все данные для спецификации, !!!!!!  может есть смысл добавить еще подраздел?
	arrТемп(iТемп, 1) = Маркер!razdel & ";" & Маркер!naim & ";" & Маркер!POZ & ";" & Маркер!kolrez
	iТемп = iТемп + 1
Next

'******************* подготовка данных *********
Set Region = objExcel.ActiveWorkbook.Sheets(sListName).Range("A1:B" & МаркерСпец.Count & "") ' определяем куда писать

Region.Value = arrТемп  'записываем массив на лист
End Function

потом аналогично создаем новый лист переходим на него и опять заполняем данными

Edited by raz
  • Like 1
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...