Helios 发表于 2011-6-16 08:26:58

无法获取图案填充循环

大家好,
我使用C++的ARX步骤来创建一个块影线。(见下文)
图案填充按预期创建。
Acad::ErrorStatus CadDrawing::AddHatch(const AcGePoint2dArray& Points, const AcGeDoubleArray& bulges)
{
Acad::ErrorStatus es = Acad::eNullHandle;
       
if (NULL != m_pCurDb)
{
AcDbObjectPointer hatch;
AcDbObjectIdArray dbObjIds;
hatch.create();
               
hatch->setNormal(AcGeVector3d::kZAxis;

hatch->setElevation(0.0);
               
hatch->setPattern(AcDbHatch::kPreDefined, _T("SOLID"));
               
hatch->setHatchStyle(AcDbHatch::kNormal);
               
hatch->setAssociative(true);
       
hatch->appendLoop(AcDbHatch::kExternal, Points, bulges);

m_CurSpace->appendAcDbEntity(hatch));
       
hatch->getAssocObjIds(dbObjIds);
LogString(L"The Hatch has (%i) AssocObjIds\n", dbObjIds.length());
}

}

接下来,我使用C#来获取hatch的外循环。
namespace HatchLoops
{
class Program
{
    static void Main(string[] args)
    {
      AcadApplication BricscadApp = (AcadApplication)Marshal.GetActiveObject("BricscadApp.AcadApplication.11.0");
      AcadDocument    BricscadDoc = BricscadApp.ActiveDocument;
      object loop;
      foreach (AcadEntity entity in BricscadDoc.ModelSpace) // search MS for the hatch
      {
      if (entity is AcadHatch)
      {
          AcadHatch hatch = entity as AcadHatch;
          if (hatch.NumberOfLoops > 0)
          {
            hatch.GetLoopAt(0, out loop);
            object[] loopObjects = (object[])loop;
            foreach (object loopObject in loopObjects)
            {
            Console.WriteLine(((AcadEntity)loopObject).EntityName);
            }
          }
      }
      else
      {
          Console.WriteLine(entity.EntityName + " is not a hatch..");
      }
      }
      Console.WriteLine("Press enter key");
      Console.ReadLine();
    }
}
}

对于ARX创建的影线,NumberOfLoops属性返回“1”,
GetLoopAt(0,out loop)方法不返回任何对象....
ARX例程末尾的检查也没有显示任何关联的对象。
当我在手动创建的影线上使用C#代码时,循环被返回。
我是不是忘记了什么,或者混淆了ARX这边的步骤顺序?阿诺·范·尤文
**** Hidden Message *****

Helios 发表于 2011-6-16 11:28:59

你好,Arno
,您可以尝试在将其添加到数据库之前添加
hatch->evaluateHatch();

pkohut 发表于 2011-6-17 03:25:47

嗨丹尼尔!
感谢您的建议,但它似乎没有解决问题。
仍然没有来自GetLoopAt和ARX日志记录的对象也显示0个附加对象。
还有其他建议吗?
阿诺

Helios 发表于 2011-6-17 13:27:03

检查Acad::ErrorStatus代码返回的每个函数。可能无法从appendLoop、appendAcDbEntity或getAssocObjIds获取eOk。如果是这样的话,那么解决方法就很容易了。

Helios 发表于 2011-6-20 04:16:00

嗨,Pkohut,
我放在这个线程顶部的代码有点简化,以显示我正在遵循的步骤。
实际上,我正在检查每个步骤的返回代码,并在出现问题时记录消息。
但是日志记录根本没有显示错误消息,表明一切顺利。
只有最后一个LogString()报告“0”关联对象。(意味着日志记录确实有效)
所以,仍然不明白这应该如何真正工作。
我真的可以使用一个提示(或两个)
Arno
见下文:
Acad::ErrorStatus CadDrawing::AddHatch(const AcGePoint2dArray& Points, const AcGeDoubleArray& bulges)
{
    Acad::ErrorStatus es = Acad::eNullHandle;
       
   if (NULL != m_pCurDb)
   {
   AcDbObjectPointer hatch;
   AcDbObjectIdArray dbObjIds;
   if ((es = hatch.create()) != Acad::eOk)
   {
       LogString(L"Failed to create hatch\n");
       return es;
      }
               
      if ((es = hatch->setNormal(AcGeVector3d::kZAxis)) != Acad::eOk)
      {
      LogString(L"Failed to set hatch Normal vector\n");
      return es;
       }
               
       if ((es = hatch->setElevation(0.0)) != Acad::eOk)
       {
          LogString(L"Failed to set hatch Elevation vector\n");
          return es;
      }
               
      if ((es = hatch->setPattern(AcDbHatch::kPreDefined, _T("SOLID"))) != Acad::eOk)
      {
         LogString(L"Failed to set hatch Pattern to SOLID\n");
         return es;
         }
               
         if ((es = hatch->setHatchStyle(AcDbHatch::kNormal)) != Acad::eOk)
         {
             LogString(L"Failed to set hatch style\n");
       return es;
          }
               
         if ((es = hatch->setAssociative(true)) != Acad::eOk)
         {
            LogString(L"Failed to set hatch assiciative\n");
            return es;
            }
       
            if ((es = hatch->appendLoop(AcDbHatch::kExternal, Points, bulges)) != Acad::eOk)
            {
           LogString(L"Failed to appendloop to hatch. Error (%i)\n", es);
           return es;
       }
       
            //setting current layer, color etc....          
       if ((es = setEntityCurProperties(hatch.object())) != Acad::eOk)
       {
                LogString(L"Failed to set hatch properties\n");
          return es;
          }
               if ((es = hatch->evaluateHatch()) != Acad::eOk)
               {
                  LogString(L"Failed to evaluate hatch\n");
             return es;
                }
                if ((es = m_CurSpace->appendAcDbEntity(hatch)) != Acad::eOk)
           {
             LogString(L"Failed to append hatch to block (%s)\n", LPCTSTR(m_CurSpaceName));
             return es;
               }
       
               if ((es = hatch->getAssocObjIds(dbObjIds)) != Acad::eOk)
               {
                  LogString(L"Failed to get hatch AssocObjIds\n");
             return es;
                  }
                  LogString(L"The Hatch has %i AssocObjIds\n", dbObjIds.length());
              return es;
       }
       
       return es;
}

Helios 发表于 2011-6-20 08:58:13


好的,在一次小小的网络搜索后发现以下内容:
用以下代码替换:
hatch->appendLoop(AcDbHatch::kExternal,Points,bulges)
:首先创建一条多段线,
-将其添加到图案填充中
-然后使用appendLoop方法将多段线ID添加到图案轮廓中。
AcDbObjectPointer polyline;
   
if ((es = polyline.create()) != Acad::eOk)
{
   LogString(L"Failed to create polyline\n");
   return es;
}
polyline->setElevation(0.0);
for (int i = 0; i addVertexAt(i, Points);
}
for (int i = 0; i setBulgeAt(i, bulges);
}
   
AcDbObjectId polyId;
   
if ((es = m_CurSpace->appendAcDbEntity(polyId, polyline)) != Acad::eOk)
{
LogString(L"Failed to append polyline to block (%s)\n", LPCTSTR(m_CurSpaceName));
return es;
}
   
AcDbObjectIdArray loops;   
loops.insertAt(0, polyId);

LogString(L"Hatch-loops has %i objects\n", loops.length());
if ((es = hatch->appendLoop(AcDbHatch::kExternal, loops)) != Acad::eOk)
{
LogString(L"Failed to appendloop to hatch. Error (%i)\n", es);
return es;
}

Helios 发表于 2011-6-20 19:04:33

太棒了!很高兴你想通了

Helios 发表于 2011-6-21 03:39:34

我发现的例子(Autodesk 2009 arxref.chm,它有多难? ) 使用方法 ->postToDb(someObject,id) 来获取 id.
在 Bricscad 的 BRX 中,我找不到该方法,所以我将折线添加到块中。
现在唯一要解决的问题是,折线(因为它是在舱口之前添加的)位于舱口下方。
我想给它一个不同的颜色来突出轮廓。
我是否必须深入研究字典才能使绘制顺序?
任何人都可以在这里开一个洞吗?
阿诺
页: [1]
查看完整版本: 无法获取图案填充循环