Хотел узнать можно ли прикрепить таймер, что бы программа выполнялась каждые 10 секунд.Встречный вопрос: а зачем тебе это? В чём смысл сего действа?
Встречный вопрос: а зачем тебе это? В чём смысл сего действа?
Нужно для проекта,Это понятно, что "для проекта". Польза в чём? Где применимо? На данный момент времени это смахивает на попытку написать код, который должен мусорить в чертеже и мешать пользователю работать.
Это понятно, что "для проекта". Польза в чём? Где применимо? На данный момент времени это напоминает попытку написать код, который должен мусорить в чертеже и мешать пользователю работать.Если быть честным, то точно я ответить не могу. Как мне было сказано, нужно проверить не ляжет ли программа и можно ли вообще использовать это.
Если быть честным, то точно я ответить не могу.В таком случае я делаю вывод, что моё предположение верно... Как следствие - от меня помощи в этом "проекте" не будет.
Ну, в таком случае я делаю вывод, что моё предположение верно. Следовательно от меня помощи в этом не будет.Думаю что всё намного проще. Программа должна опрашивать "что-то" и при получении новых данных рисовать в AutoCAD.
Думаю что всё намного проще. Программа должна опрашивать "что-то" и при получении новых данных рисовать в AutoCAD.Автор не указывал, что AutoCAD должен работать как сервер, получающий команду из вне и выполняющий запрошенные операции. Я такое делал - с одного компьютера запускал команды (из обычного консольного exe), которые отправлялись на консоль AutoCAD, расположенного на удалённой рабочей машинке. AutoCAD выполнял эти команды.
Автор не указывал, что AutoCAD должен работать как серверТо, что я предположил - это не работа AutoCAD в режиме сервера.
Думаю что всё намного проще. Программа должна опрашивать "что-то" и при получении новых данных рисовать в AutoCAD.Верно, задача была в этом.
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.EditorInput;
namespace rabota
{
public class rabota
{
[CommandMethod("Start")]
public void addStart()
{
Database dbCurrent = Application.DocumentManager.MdiActiveDocument.Database;
using (Transaction trAdding = dbCurrent.TransactionManager.StartTransaction())
{
Circle cNewCircle = new Circle();
cNewCircle.Center = new Point3d(0, 0, 0);
cNewCircle.Radius = 100;
cNewCircle.ColorIndex = 5;
BlockTableRecord btrCurrSpace = trAdding.GetObject
(dbCurrent.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
ObjectId oidCircle = btrCurrSpace.AppendEntity(cNewCircle);
trAdding.AddNewlyCreatedDBObject(cNewCircle, true);
trAdding.Commit();
}
}
}
}
2. В таком виде как ты хочешь, а именно из события таймера, ты не сможешь это сделать. Причина этого - AutoCAD .NET API не потокобезопасный.
Но это не значит, что ничего сделать нельзя. Это можно сделать из других событий AutoCAD .NET API, когда AutoCAD свободен.
Например, в событии Editor.EnteringQuiescentState. Таким образом сценарий может быть таким:
1) В событии таймера ты готовишь информацию для отрисовки примитивов и выставляешь флажок.
2) В событии Editor.EnteringQuiescentState ты проверяешь этот флажок и если он true, то отрисовываешь примитивы и флажок снимаешь. При этом следует учесть, что в событии Editor.EnteringQuiescentState следует блокировать документ, который собираешься модифицировать.
А можно более подробнее про таймер и флажок.Хорошо. Я подготовлю небольшой пример и выложу его.
Хорошо. Я подготовлю небольшой пример и выложу его.
А вот и статья на эту тему: Использование потоков (Thread) для фоновой обработки
А вот и статья на эту тему: Использование потоков (Thread) для фоновой обработки
А ты случайно не exe-файл собираешься делать? Я так подумал глядя на название WindowsFormsApplication1. AutoCAD .NET API можно использовать только из dll-сборок, загруженных внутрь AutoCAD командой _NETLOAD или аналогичными способами.
P.S.: Заодно уточни версию Visual Studio, которую ты используешь и разрядность Windows и AutoCAD (32- или 64-разрядные).
« Последнее редактирование: 24-09-2014, 17:16:24 от Александр Ривилис »
нет, я просто пробовал после ClassLibrary, Visual Studio 2010 года, Windows 7 x64Не получится. AutoCAD 2012 требует .NET 4.0 (или выше), а VS 2010 позволяет создавать приложения не выше .NET 3.5
Не получится. AutoCAD 2012 требует .NET 4.0 (или выше), а VS 2010 позволяет создавать приложения не выше .NET 3.5
Таким образом для AutoCAD 2012 тебе нужен VS 2012 или 2013.
Стоп. В этот я раз я попытался сбить тебя с толку.
VS 2010 годится для создания приложения для AutoCAD 2012 - она поддерживает .NET 4.0
Тогда что нужно сделать, что бы убрать эти ошибки:Например, подключить к проекту соответствующую сборку, в которой определены эти контролы (System.Windows.Forms).
Например, подключить к проекту соответствующую сборку, в которой определены эти контролы (System.Windows.Forms).
Плохо быть по пояс деревянным, спасибо Вам.Теперь всё нормально?
Теперь всё нормально?
да, все указал и вуаля, заработало!)И даже окружности рисуются с интервалом приблизительно в секунду? И работать не мешает?
И даже окружности рисуются с интервалом приблизительно в секунду? И работать не мешает?
И даже окружности рисуются с интервалом приблизительно в секунду? И работать не мешает?
Еще я хотел у Вас узнать, вместо окружности возможно ли вставить блок или допустим полилинию?Конечно. Модифицируй метод FinishedProcessing по своему усмотрению.
Конечно. Модифицируй метод FinishedProcessing по своему усмотрению.
using (AcDb.Circle circ = new AcDb.Circle(c_center, AcGe.Vector3d.ZAxis, c_radius))
Цитата: Александр Ривилис от 22-09-2014, 19:53:14
using (AcDb.Circle circ = new AcDb.Circle(c_center, AcGe.Vector3d.ZAxis, c_radius))
Хотел спросить, что делать с этой строчкой, за что она отвечает? Пытаюсь поставить вместо круга полилинию, но застопорился за этой строчке.
Если число вершин тоже случайное число, то приблизительно так:
Меня еще один момент интересует, примитивы он рисует, вот только когда, например, рисуешь что то другое, они не появляются, когда заканчиваешь они все появляются.А иначе и быть не может. Я писал уже о том, что к AutoCAD можно обращаться только из главной задачи (Thread). Так как пока ты рисуешь что-то другое, главная задача занята. Когда она освобождается - рисуется то, что ты задал рисовать в таймере.
А иначе и быть не может. Я писал уже о том, что к AutoCAD можно обращаться только из главной задачи (Thread). Так как пока ты рисуешь что-то другое, главная задача занята. Когда она освобождается - рисуется то, что ты задал рисовать в таймере.
Так получается этого сделать невозможно или просто AutoCAD посыпется?А в чем разница? Считай что это сделать невозможно, потому что AutoCAD "посыпется". Можно только так, как я показал.
А в чем разница? Считай что это сделать невозможно, потому что AutoCAD "посыпется". Можно только так, как я показал.
Еще вопрос по поводу полилинии, как проще сделать из двумерной трехмерную, в примере что Вы мне написали?Замени Polyline на Polyline3d, AddVertexAt на AppendVertex. При этом нужно будет создать PolylineVertex3d, передав конструктору точку вершины.
Программа для совместной работы над чертежом.А практическая польза от такого способа работы какая? Я не утверждаю, что её нет в принципе, но для себя мне не удаётся придумать примеры, когда такой способ работы реально может быть востребован. Пока что, на мой взгляд, это выглядит это достаточно хрупко и, подозреваю, что толком не тестировано. Порой потеря DWG может оказаться слишком дорогим удовольствием (несомненно, во многих компаниях по ночам выполняется резервное копирование, но порой потеря работы даже одного дня может оказаться неприемлемой).
понятно что с тех пор скил несколько выросКаюсь, на дату не посмотрел :)
Андрей Бушман, Андрей, мы обсуждали эту программу еще летом, после публикации видео и ссылку на код я тебе скидывал =о) и там же оговаривал сопутствующие условия.Может и обсуждали, но я этого не помню. К сожалению моя память оставляет желать лучшего (на полном серьёзе).