Установка текущего слоя

Автор Тема: Установка текущего слоя  (Прочитано 17011 раз)

0 Пользователей и 4 Гостей просматривают эту тему.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Установка текущего слоя
« Ответ #15 : 14-10-2014, 16:50:56 »
Почему-то при попытке нанести блок происходит "залипание" панели свойств...
Я же написал, что это скорее всего баг AutoCAD. Проверю в AutoCAD 2015 и если там тоже самое - отправлю в ADN DevHelp.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Установка текущего слоя
« Ответ #16 : 14-10-2014, 18:50:29 »
Но значения в панеле свойств и в панелях слоёв и цвета разные?
https://screencast.autodesk.com/Main/Details/a1541329-3d8a-472d-8583-0727db16eb7a
Интересно, а где правильные? Если проверить значения переменных CLAYER и т.п., что покажут?
Если неправильные значения в ленте, то, может быть, есть какой-то дополнительный метод "обновить ленту"?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Установка текущего слоя
« Ответ #17 : 14-10-2014, 20:06:19 »
Интересно, а где правильные?
Правильные в ленте, а неправильные в Панели свойств. Причем даже если после этого выбрать что-то на экране (чтобы Панель свойств обновилась), а потом отменить выбор, то всё-равно в Панели свойств будут неправильные значения. И только пара команд _PROPERTIESCLOSE/_PROPERTIES приводят Панель свойств в нормальное состояние.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Установка текущего слоя
« Ответ #18 : 16-10-2014, 14:57:46 »
Отправил запрос в ADN DevHelp. Подождем их реакцию.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Установка текущего слоя
« Ответ #19 : 17-10-2014, 13:52:59 »
Пока ждал реакцию из ADN DevHelp решил проверить как работает аналогичный код в чистом ObjectARX:
Код - C++ [Выбрать]
  1. //-----------------------------------------------------------------------------
  2. //----- acrxEntryPoint.cpp
  3. //-----------------------------------------------------------------------------
  4. #include "StdAfx.h"
  5. #include "axlock.h"
  6. #include "resource.h"
  7.  
  8. //-----------------------------------------------------------------------------
  9. #define szRDS _RXST("")
  10.  
  11. //-----------------------------------------------------------------------------
  12. //----- ObjectARX EntryPoint
  13. class CTestCmdArxApp : public AcRxArxApp {
  14.  
  15. public:
  16.   CTestCmdArxApp () : AcRxArxApp () {}
  17.  
  18.   virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
  19.     // TODO: Load dependencies here
  20.  
  21.     // You *must* call On_kInitAppMsg here
  22.     AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
  23.  
  24.     // TODO: Add your initialization code here
  25.  
  26.     return (retCode) ;
  27.   }
  28.  
  29.   virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
  30.     // TODO: Add your code here
  31.  
  32.     // You *must* call On_kUnloadAppMsg here
  33.     AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;
  34.  
  35.     // TODO: Unload dependencies here
  36.  
  37.     return (retCode) ;
  38.   }
  39.  
  40.   virtual void RegisterServerComponents () {
  41.   }
  42.  
  43.   static void RanTestCmd () {
  44.     if (curDoc() == NULL) return;
  45.     AcDbDatabase *pDb = curDoc()->database();
  46.     AcAxDocLock doclock(pDb);
  47.     AcDbObjectId newLayerId;
  48.     resbuf _cmdecho; _cmdecho.restype = RTSHORT; _cmdecho.resval.rint = 0;
  49.     acedGetVar(_T("CMDECHO"),&_cmdecho);
  50.     if (_cmdecho.resval.rint == 0)  {
  51.       _cmdecho.resval.rint = 1;
  52.       acedSetVar(_T("CMDECHO"),&_cmdecho);
  53.       _cmdecho.resval.rint = 0;
  54.     }
  55.     {
  56.       AcDbLayerTablePointer pLT(pDb->layerTableId(), AcDb::kForRead);
  57.       if (pLT.openStatus() != Acad::eOk) return;
  58.       if (pLT->getAt(_T("New Layer"), newLayerId) != Acad::eOk) {
  59.         AcDbLayerTableRecordPointer pLTR;   pLTR.create();
  60.         pLTR->setName(_T("New Layer"));
  61.         if (pLT->upgradeOpen() != Acad::eOk) return;
  62.         if (pLT->add(newLayerId,pLTR) != Acad::eOk) return;
  63.       }
  64.     }
  65.     pDb->setClayer(newLayerId);
  66.     AcCmColor _cecolor = pDb->cecolor();
  67.     AcDbObjectId _clayer = pDb->clayer();
  68.     AcCmColor color; color.setColorIndex(30);
  69.     pDb->setCecolor(color);
  70.     AcDb::LineWeight _celweight = pDb->celweight();
  71.     pDb->setCelweight(AcDb::kLnWt100);
  72.     resbuf *rb = acutBuildList(RTSTR,_T("_INSERT"), RTSTR,_T("PICKET"),RTSTR,_T("_SCALE"), RTSTR,_T("1"), NULL);
  73.     acedCmd(rb);
  74.     while (true) {
  75.       resbuf rbNames; rbNames.restype = RTSTR; rbNames.resval.rstring = NULL;
  76.       acedGetVar(_T("CMDNAMES"), &rbNames);
  77.       if (rbNames.resval.rstring != NULL && CString(rbNames.resval.rstring).MakeUpper().Find(_T("INSERT")) >= 0) {
  78.         acutRelRb(rb); rb = acutBuildList(RTSTR,_T("\\"),NULL);
  79.         if (acedCmd(rb) != RTNORM) break;
  80.       } else break;
  81.     }
  82.     acedSetVar(_T("CMDECHO"),&_cmdecho);
  83.     pDb->setClayer(_clayer);
  84.     pDb->setCecolor(_cecolor);
  85.     pDb->setCelweight(_celweight);
  86.   }
  87. } ;
  88.  
  89. //-----------------------------------------------------------------------------
  90. IMPLEMENT_ARX_ENTRYPOINT(CTestCmdArxApp)
  91.  
  92. ACED_ARXCOMMAND_ENTRY_AUTO(CTestCmdArxApp, Ran, TestCmd, TestCmd, ACRX_CMD_MODAL, NULL)

Код делает абсолютно тоже самое, что и исходный код на C#. И результат точно такой же, т.е. в Панели Свойств и в Ленте получаем разные значения. В Панели Свойств значения неправильные. Интересный факт. Отправил тоже в ADN DevHelp.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AndreyАвтор темы

  • ADN Club
  • Сообщений: 33
  • Карма: 0
Re: Установка текущего слоя
« Ответ #20 : 17-10-2014, 14:43:40 »
И в AutoCAD 2015 также работает?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Установка текущего слоя
« Ответ #21 : 17-10-2014, 21:27:28 »
И в AutoCAD 2015 также работает?
Я пока не проверял. В таком виде этот код не будет работать в AutoCAD 2015, т.к. в нём нельзя использовать acedCmd, а нужно использовать acedCmdC/acedCmdS в ObjectARX и Editor.Command/Editor.CommandAsync в .NET
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Установка текущего слоя
« Ответ #22 : 18-10-2014, 18:19:06 »
Уже проверил и для AutoCAD 2015 SP2 - ситуация точно такая же. На всякий случай привожу код. Он может быть полезен для понимания того как в AutoCAD 2015 можно запустить команду с запросом к пользователю и дождаться завершения её выполнения:
Код - C# [Выбрать]
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using Autodesk.AutoCAD.ApplicationServices;
  7. using Autodesk.AutoCAD.Colors;
  8. using Autodesk.AutoCAD.DatabaseServices;
  9. using Autodesk.AutoCAD.EditorInput;
  10. using Autodesk.AutoCAD.Runtime;
  11. using System.Runtime.InteropServices;
  12. using AcAp = Autodesk.AutoCAD.ApplicationServices;
  13. using AcCl = Autodesk.AutoCAD.Colors;
  14.  
  15. [assembly: CommandClass(typeof(AcadTest.Commands))]
  16.  
  17. namespace AcadTest
  18. {
  19.   public class Commands
  20.   {
  21.     // Вспомогательная функция для проверки работает ли команда _INSERT
  22.     public static bool isInsertActive()
  23.     {
  24.       string str = (string)Application.GetSystemVariable("CMDNAMES");
  25.       if (str.ToUpper().Contains("INSERT") == true) {
  26.         return true;
  27.       }
  28.       return false;
  29.     }
  30.     [CommandMethod("testCmd")]
  31.     public static async void CmdTest()
  32.     {
  33.       Document acDoc = AcAp.Application.DocumentManager.MdiActiveDocument;
  34.       if (acDoc == null)
  35.         return;
  36.       Database acCurDb = acDoc.Database;
  37.       Editor ed = acDoc.Editor;
  38.  
  39.       using (DocumentLock docLock = acDoc.LockDocument())
  40.       {
  41.         AcCl.Color CurrentColor = acCurDb.Cecolor;
  42.         acCurDb.Cecolor = Color.FromColorIndex(ColorMethod.ByAci, 30);
  43.  
  44.         LineWeight CurrentLWHT = acCurDb.Celweight;
  45.         acCurDb.Celweight = LineWeight.LineWeight100;
  46.  
  47.         ObjectId CurrentLayerID = acCurDb.Clayer;
  48.         ObjectId newLayer = new ObjectId();
  49.         using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  50.         {
  51.           LinetypeTable acLineTypTbl = acTrans.GetObject(acCurDb.LinetypeTableId, OpenMode.ForWrite) as LinetypeTable;
  52.           LayerTable acLyrTbl = acTrans.GetObject(acCurDb.LayerTableId, OpenMode.ForWrite) as LayerTable;
  53.  
  54.           if (!acLyrTbl.Has("New Layer"))
  55.           {
  56.             LayerTableRecord acLyrTblRec = new LayerTableRecord();
  57.  
  58.             acLyrTblRec.Name = "New Layer";
  59.             acLyrTbl.UpgradeOpen();
  60.             acLyrTbl.Add(acLyrTblRec);
  61.             acTrans.AddNewlyCreatedDBObject(acLyrTblRec, true);
  62.             ed.WriteMessage("\n'New Layer' created");
  63.             newLayer = acLyrTblRec.ObjectId;
  64.           }
  65.           else
  66.             newLayer = acLyrTbl["New Layer"];
  67.  
  68.           acTrans.Commit();
  69.         }
  70.         acCurDb.Clayer = newLayer;
  71.  
  72.         await ed.CommandAsync(new object[] { "_.INSERT", "PICKET", "_SCALE", "1"});
  73.         short echo = (short)AcAp.Application.GetSystemVariable("CMDECHO");
  74.         if (echo == 0) AcAp.Application.SetSystemVariable("CMDECHO", 1);
  75.  
  76.         while (isInsertActive())
  77.         {
  78.           await ed.CommandAsync(new object[] { Editor.PauseToken });
  79.         }
  80.  
  81.         AcAp.Application.SetSystemVariable("CMDECHO", echo);
  82.  
  83.         acCurDb.Cecolor = CurrentColor;
  84.         acCurDb.Clayer = CurrentLayerID;
  85.         acCurDb.Celweight = CurrentLWHT;
  86.       }
  87.     }
  88.   }
  89. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AndreyАвтор темы

  • ADN Club
  • Сообщений: 33
  • Карма: 0
Re: Установка текущего слоя
« Ответ #23 : 21-10-2014, 12:35:38 »
Спасибо!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Установка текущего слоя
« Ответ #24 : 24-10-2014, 01:47:18 »
В ADN DevHelp подтвердили проблему и передали команде инженеров. В качестве временного решения предложили запускать команду _PROPERTIES, которая действительно обновляет окно свойств. Но запуск её ни через SendStringToExecute, ни через acedCmd, ни через Editor.Command/Editor.CommandAsync не приводит к обновлению окна Панели свойств. Во всяком случае в AutoCAD 2015. Для меня это загадка. Подождём дополнительной информации из ADN DevHelp.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Установка текущего слоя
« Ответ #25 : 27-10-2014, 20:28:18 »
Команда ADN DevHelp также удивлена таким поведением и направила этот вопрос команде инженеров. Вот так с какой-то мелочи был найден древний баг в AutoCAD API. :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение