无法获取图案填充循环
大家好,我使用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 ***** 你好,Arno
,您可以尝试在将其添加到数据库之前添加
hatch->evaluateHatch();
嗨丹尼尔!
感谢您的建议,但它似乎没有解决问题。
仍然没有来自GetLoopAt和ARX日志记录的对象也显示0个附加对象。
还有其他建议吗?
阿诺
检查Acad::ErrorStatus代码返回的每个函数。可能无法从appendLoop、appendAcDbEntity或getAssocObjIds获取eOk。如果是这样的话,那么解决方法就很容易了。 嗨,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;
}
好的,在一次小小的网络搜索后发现以下内容:
用以下代码替换:
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;
}
太棒了!很高兴你想通了 我发现的例子(Autodesk 2009 arxref.chm,它有多难? ) 使用方法 ->postToDb(someObject,id) 来获取 id.
在 Bricscad 的 BRX 中,我找不到该方法,所以我将折线添加到块中。
现在唯一要解决的问题是,折线(因为它是在舱口之前添加的)位于舱口下方。
我想给它一个不同的颜色来突出轮廓。
我是否必须深入研究字典才能使绘制顺序?
任何人都可以在这里开一个洞吗?
阿诺
页:
[1]