Перейти к содержанию

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


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

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

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

 

Потому что такая конструкция выдает ошибку: "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

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

Ссылка на сообщение
Поделиться на другие сайты
  • Ответов 267
  • Дата создания
  • Последний ответ

Лучшие авторы в теме

Лучшие авторы в теме

Популярные посты

не все. от версии к версии поддержка LISP растет. по этому куску вырванного из контекста, не понятно, что там проще или сложнее. по языкам ИМХО: LISP - кроме автокад/нанокад, почти нигде не понадо

Начиная с 7 версии можно получить nanocad.application через .NET, способом не зависящим от регистрации COM сервера   https://github.com/RobinKzn/CustomAutosaveNanoCad/blob/master/autosave7x3

неужели никаких предложений нету?

Изображения в теме

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

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

 

Потому что такая конструкция выдает ошибку: "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

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

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

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

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

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

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

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

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

 

Спасибо.

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

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

 

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

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;
// что бы здесь сделать с документом некоторые действия.
}

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

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

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;
// здесь некоторые действия
}

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

Добрый день!

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

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

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

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

Result := IDispatch(ovnanoCAD) as InanoCADApplication;

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

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

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

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

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

Всем привет. Пытаюсь получить координату точки. Нашел здесь 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", "Укажите точку"));
    }

 

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

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

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

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

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

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

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

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

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

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

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

На 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);

Что не так?

Изменено пользователем Александр_
Ссылка на сообщение
Поделиться на другие сайты
  • 2 недели спустя...

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

Начинаю программировать для 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 почему-то не знает :(

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

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

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

Начинаю программировать для 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

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

в с# и 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 это возможно?

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

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

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

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

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

public bool ExportToExcel(ref String strPath);

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

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

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

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

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

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

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

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

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

Ссылка на сообщение
Поделиться на другие сайты
  • 2 недели спустя...
Там 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

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

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

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

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

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

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

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

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

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

может кто подскажет как на другом языке сделать? (см.пост выше). Суть вопроса - нужно все таблицы из .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

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

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

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

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

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

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

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

Загрузка...
  • Расскажите друзьям

    Нравится Официальный форум компании Нанософт? Расскажите друзьям!

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