Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Алексей (IdeaSoft) от 30-07-2014, 14:33:05

Название: Не копируются примитивы в буфер обмена
Отправлено: Алексей (IdeaSoft) от 30-07-2014, 14:33:05
Пользователь в Autocad 2015 не может выполнить копирование примитивов через буфер
ни внутри чертежа не между чертежами.
Примитивы "обычные" ни каких прокси нет.
В чем причина может нужно загрузить дополнительно приложение ARX
Если только в этом вопрос, то какое приложение подгрузить?
Или причина еще может быть в чем-то другом?
Название: Re: Не копируются примитивы в буфер обмена
Отправлено: Александр Ривилис от 30-07-2014, 19:03:24
1. Причем здесь раздел ObjectARX?
2. К программированию это прямого отношения не имеет.
3. Проблема возникает в конкретном чертеже или во всех чертежах?
4. Если проблема конкретного чертежа, то где чертеж? Иначе это гадание на кофейной гуще.
5. Если такое происходит со всеми чертежами, то какие приложения загружены? Это могут быть проблемы приложений (например, незакрытые транзакции).
Название: Re: Не копируются примитивы в буфер обмена
Отправлено: Алексей (IdeaSoft) от 30-07-2014, 19:45:05
Это к программированию прямого отношения не имеет, только если программист не будет использовать
через командную строку (..._copyclip...)
Я спешил и не нашел подходящего раздела
А раздел ARX выбрал, т.к. видел видео http://vimeo.com/28495254
где говорили про загрузку arx-приложения.
Проблема возникает у пользователя на компьютере на любых фалах.
При чем у другого пользователя сидящего рядом все OK!
 
Название: Re: Не копируются примитивы в буфер обмена
Отправлено: Алексей Кулик от 30-07-2014, 20:38:32
Попробуй удалить профиль AutoCAD. Иногда помогает (причину не знаю).
Название: Re: Не копируются примитивы в буфер обмена
Отправлено: Алексей (IdeaSoft) от 30-07-2014, 20:45:38
Профиль удалить попробую, спасибо за совет.
Название: Re: Не копируются примитивы в буфер обмена
Отправлено: Александр Ривилис от 30-07-2014, 20:50:43
Это к программированию прямого отношения не имеет, только если программист не будет использовать
через командную строку (..._copyclip...)
Об этом разговора не было. В противном случае был бы приложен код...  ;)
Я спешил и не нашел подходящего раздела
Зря. Спешка тут не поможет.
Проблема возникает у пользователя на компьютере на любых фалах.
При чем у другого пользователя сидящего рядом все OK!
Значит остаются две возможности:
1) на этом PC установлено еще какое-то приложение, которое мешает копированию
2) плохо установился AutoCAD или что-то произошло с его файлами во время работы.
В первом случае проанализировать чем отличаются AutoCAD'ы и приложения на них у этих двух пользователей.
Во втором - переставить AutoCAD. Сначала попробовать режим исправления ошибок. Если не поможет, то полная деинсталляция (с чисткой оставшихся файлов и реестра), а затем повторная установка.
P.S.: Кстати я нигде не увидел сообщения об ошибке при копировании. Или это ошибка при вставке из буфера обмена? 
Название: Re: Не копируются примитивы в буфер обмена
Отправлено: Алексей (IdeaSoft) от 30-07-2014, 21:29:13
Скоро я навещу этого пользователя и если ошибка все еще будет попробую сделать скрины
и подробнее опишу ситуацию. Приложения у него дополнительные есть, но у другого человека эти приложения есть тоже и все копируется хорошо.

Название: Re: Не копируются примитивы в буфер обмена
Отправлено: Александр Ривилис от 30-07-2014, 21:30:27
Скоро я навещу этого пользователя и если ошибка все еще будет попробую сделать скрины
и подробнее опишу ситуацию.
Вот с этого и нужно начинать!  :)
Название: Re: Не копируются примитивы в буфер обмена
Отправлено: Алексей (IdeaSoft) от 30-07-2014, 21:31:06
Спешка тут не поможет
А в какой раздел поместить этот вопрос?
Название: Re: Не копируются примитивы в буфер обмена
Отправлено: Алексей (IdeaSoft) от 30-07-2014, 21:32:28
Вот с этого и нужно начинать!
У пользователя явных сообщение не было, но что писалось в динамической подсказке.
Название: Re: Не копируются примитивы в буфер обмена
Отправлено: Александр Ривилис от 30-07-2014, 21:56:22
Цитата: Александр Ривилис от 30-07-2014, 19:50:43

    Спешка тут не поможет

А в какой раздел поместить этот вопрос?
Пока пусть побудет здесь. По поводу спешки я имел в виду, что в вопросе очень желательно указать сразу всю информацию. Пусть её даже будет больше, чем окажется необходимым для решения вопроса.
Название: Re: Не копируются примитивы в буфер обмена
Отправлено: Алексей (IdeaSoft) от 07-08-2014, 18:54:19
Прикрепляю файл в котором не получается скопировать примитивы в буфер обмена
Я уточнил, что у пользователя не все подряд файлы не копируются, а только те которые
формируются на основе шаблона с помощью моего алгоритма.
Алгоритм сам по себе большой.
Вот ключевые позиции алгоритма:

1) открываем базу шаблона db.ReadDwgFile(NameTemplate, IO.FileShare.ReadWrite, False, Nothing)
2) Формируем массив Entity()
3) Добавляем в базу примитивы из массива Entity()
4) Делаем в цикле Ent(i).Dispose()
5) Сохраняем файл db.SaveAs(FullFileName, Autodesk.AutoCAD.DatabaseServices.DwgVersion.AC1015)
6) db.CloseInput(True)
7) db.Dispose()

У меня на машине под AutoCAD 2012 все нормально проблем нет.
А у пользователя под AutoCAD 2015 не копируются в буфер примитивы результирующего файла.

Скорее в алгоритме где-то косяк в позициях 2), 3), 4) может Dispose делать не нужно?

Думаю, что нужно теперь эту тему разместить в раздел AutoCAD API .NET, т.к. она связана на прямую с моим кодом
Название: Re: Не копируются примитивы в буфер обмена
Отправлено: Александр Ривилис от 07-08-2014, 19:05:25
1. В чертеже ошибки, которые запросто могут препятствовать копированию в буфер обмена:
Command: _AUDIT
Fix any errors detected? [Yes/No] <N>: y
Auditing Header
Auditing Tables
AcDbDictionary(C)   ACAD_MATERIAL eDuplicateIndex       Delete Entry
Auditing Entities Pass 1
Pass 1 1700    objects audited
Auditing Entities Pass 2
Pass 2 1700    objects audited
Auditing Blocks
 18      Blocks audited
Auditing AcDsRecords
Total errors found 1 fixed 1
Erased 0 objects
2. При копировании в буфер обмена появляются сообщения:
Command: _copyclip 188 found
 *Warning* Multiply owned object, handle "D"
 *Warning* Multiply owned object, handle "57"
3. Пункты 2) 3) 4) я совсем не понял:
  a) Как формируется массив Entity ???
  b) Куда, а главное как добавляются примитивы в базу ???
  с) Если добавил в базу примитивы то незачем делать им Dispose
Это для начала. Ну и сам шаблон сначала проверь командой _AUDIT. Может быть ошибка в нем и ты её таскаешь по файлам.
Название: Re: Не копируются примитивы в буфер обмена
Отправлено: Александр Ривилис от 07-08-2014, 19:15:33
Кстати, а если запустить этому файлу _RECOVER, то ошибок становится намного больше, они все исправляются и копирование/вставка происходит совершенно нормально:
Drawing recovery.
Drawing recovery log.
Validating objects in the handle table.
Valid objects 1816   Invalid objects 0
Validating objects completed.
AcDbDictionary(C)   ACAD_MATERIAL eDuplicateIndex       Delete Entry
Recover: error 120 opening Named Objects Dictionary.
Created new NOD.
Setting NOD ACAD_MLINESTYLE dict id.
Setting NOD ACAD_GROUP dict id.
Setting NOD ACAD_LAYOUT dict id.
Setting NOD ACAD_PLOTSTYLENAME dict id.
Setting NOD ACAD_PLOTSETTINGS dict id.
Setting NOD ACAD_MATERIAL dict id.
Setting NOD ACAD_VISUALSTYLE dict id.
Creating new ACAD_COLOR dictionary
    Salvaged database from drawing.
Auditing Header
Auditing Tables
Auditing Entities Pass 1
Pass 1 1700    objects audited
Auditing Entities Pass 2
AcDbDimStyleTableRecord: "ISO-25"
                                  Not in Table          Added
AcDbDictionary(6A)     Imperial24 eNotThatKindOfClass   Delete Entry
AcDbDictionary(6A)       Metric50 eNotThatKindOfClass   Delete Entry
Pass 2 1700    objects auditedAcDbDictionary(D)        Owner Id != Dictionary Id      Fix it
AcDbDictionary(D)
               Dictionary Reactor Missing               Attach it
AcDbDictionary(1A)       Owner Id != Dictionary Id      Fix it
AcDbDictionary(1A)
               Dictionary Reactor Missing               Attach it
AcDbDictionary(6A)       Owner Id != Dictionary Id      Fix it
AcDbDictionary(6A)
               Dictionary Reactor Missing               Attach it
AcDbDictionary(17)       Owner Id != Dictionary Id      Fix it
AcDbDictionary(17)
               Dictionary Reactor Missing               Attach it
AcDbDictionary(19)       Owner Id != Dictionary Id      Fix it
AcDbDictionary(19)
               Dictionary Reactor Missing               Attach it
AcDbDictionaryWithDefault(E)
                         Owner Id != Dictionary Id      Fix it
AcDbDictionaryWithDefault(E)
               Dictionary Reactor Missing               Attach it
AcDbDictionary(11D)      Owner Id != Dictionary Id      Fix it
AcDbDictionary(11D)
               Dictionary Reactor Missing               Attach it
Auditing Blocks
 18      Blocks audited
Auditing AcDsRecords
Total errors found 26 fixed 26
Erased 0 objects
Название: Re: Не копируются примитивы в буфер обмена
Отправлено: Александр Ривилис от 07-08-2014, 19:17:12
Переношу тему в раздел .NET, так как ошибка похоже связана именно с твоим кодом.
Название: Re: Не копируются примитивы в буфер обмена
Отправлено: Алексей (IdeaSoft) от 07-08-2014, 21:52:08
Спасибо за ответ, тщательно проанализирую код и проверю шаблон на ошибки.
Думаю если на моей машине все нормально, может непосредственно у пользователя в шаблоне ошибки.
массив Entity формирую просто

к примеру так:
...
Dim Ent = new List(of Entity)
Dim ln As New Autodesk.AutoCAD.DatabaseServices.Line(p3d1, p3d2)
Ent.Add(Ln)
...
Сложных объектов не использую, только:
Line, Ellipce, DBText, Mtext, Polyline, Hatch, еще использую BlockReference, но не для этого случая.
Название: Re: Не копируются примитивы в буфер обмена
Отправлено: Александр Ривилис от 08-08-2014, 02:04:39
массив Entity формирую просто

к примеру так:
...
Dim Ent = new List(of Entity)
Dim ln As New Autodesk.AutoCAD.DatabaseServices.Line(p3d1, p3d2)
Ent.Add(Ln)

Конечно же я имел в виду не этот кусочек кода. Значительно интереснее как этим примитивам задаются параметры типа цвет, слой, тип линии и т.д. и как эти параметры связаны с базой шаблона.

И конечно же нужно понять как ты эти примитивы добавляешь в базу. И добавляешь ли только примитивы.
Короче говоря без кода помочь крайне сложно.
Название: Re: Не копируются примитивы в буфер обмена
Отправлено: Алексей (IdeaSoft) от 08-08-2014, 03:25:18
В целом весь код большой (4000 записей) и для анализа с ним работать будет трудно.
Если я не найду причину, то я выберу ключевые алгоритмы пришлю для анализа кода только их.

Проверил у себя командой _AUDIT:
в шаблоне  - ошибок нет.
в результирующем файле - ошибок нет.

Нужно взять еще у пользователя файл шаблона и проверить его на ошибки

Название: Re: Не копируются примитивы в буфер обмена
Отправлено: Алексей (IdeaSoft) от 08-08-2014, 03:45:33
Значительно интереснее как этим примитивам задаются параметры типа цвет, слой, тип линии и т.д

По этому поводу я обратил внимание на то, что, к примеру,  цвет и вес линии можно задать примитиву, не добавляя его в базу. А вот, что касается:  установки слоев, выравнивания текстов, назначения ассоциаций заливкам, масштабирование (scale), перемещение, то это возможно сделать только после добавления примитива в базу методами
AppendEntity(Entity)
AddNewlyCreatedDBObject(Entity, True)
и только потом устанавливает слои и прочее...
Название: Re: Не копируются примитивы в буфер обмена
Отправлено: Александр Ривилис от 08-08-2014, 04:03:21
А вот, что касается:  установки слоев, выравнивания текстов, назначения ассоциаций заливкам, масштабирование (scale), перемещение, то это возможно сделать только после добавления примитива в базу методами
AppendEntity(Entity)
AddNewlyCreatedDBObject(Entity, True)
и только потом устанавливает слои и прочее...
Ну есть еще и метод Entity.SetDatabaseDefaults Method (Database)
Название: Re: Не копируются примитивы в буфер обмена
Отправлено: Алексей (IdeaSoft) от 08-08-2014, 07:46:56
SetDatabaseDefaults
Я об этом методе знаю, но пока еще его не применял.
Времени не хватало разобраться.
Судя по названию и передаваемому аргументу этот
метод устанавливает основные параметры (слой, цвет и т.п.) примитиву,
которые определены базой, передаваемой в аргументе, или без этого аргумента.
 
Название: Re: Не копируются примитивы в буфер обмена
Отправлено: Алексей (IdeaSoft) от 08-08-2014, 16:42:45
Сделал тестовый вариант в котором ничего с базой данных чертежа не делаю
просто открываю шаблон и сохраняю его SaveAs(...)
И все равно ошибки в результирующем файле c:\1\new_file.dwg ошибки
Такое только в acad 2015 и 2014. В acad 2012 такого нет. В acad 2013 не проверял.
Прикрепляю файл шаблона dwt
Вот код:
Код - vb.net [Выбрать]
  1.         <CommandMethod("TEST_OUT_FILE")> _
  2.         Public Sub test_out()
  3.             Dim db As New Database()
  4.             Dim NameTemplate As String = "c:\1\psm_profil.dwt"
  5.             db.ReadDwgFile(NameTemplate, IO.FileShare.ReadWrite, False, Nothing)
  6.             Dim FullFileName As String = "c:\1\new_file.dwg"
  7.             db.SaveAs(FullFileName, Autodesk.AutoCAD.DatabaseServices.DwgVersion.Current)
  8.             db.CloseInput(True)
  9.             db.Dispose()
  10.         End Sub
  11.  
Название: Re: Не копируются примитивы в буфер обмена
Отправлено: Дмитрий Загорулькин от 08-08-2014, 17:02:04
http://adn-cis.org/forum/index.php?topic=538.msg1718#msg1718
Нашел 2 отличия:
1. База данных создается с параметрами.
2. CloseInput перед SaveAs
Название: Re: Не копируются примитивы в буфер обмена
Отправлено: Александр Ривилис от 08-08-2014, 18:16:08
Не проверял, но похоже именно в этом причина. В первую очередь это связано с конструктором. Если дальше планируется использовать метод ReadDwgFile, то первый параметр конструктора должен быть false. Иначе создается база с готовыми таблицами и ReadDwgFile приведет к дублированию таблиц и соотвественно база может стать сбойной.
Название: Re: Не копируются примитивы в буфер обмена
Отправлено: Алексей (IdeaSoft) от 08-08-2014, 18:25:53
Ребята спасибо!
Cделал в констркуторе Database(false, true)
и CloseInput поставил перед SaveAs
Проверил все работает без ошибок!

Название: Re: Не копируются примитивы в буфер обмена
Отправлено: Александр Ривилис от 08-08-2014, 18:52:44
Отлично!