<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Custom AcDbEntity Contain BlockReference subGetOsnapPoints Error in ObjectARX Forum</title>
    <link>https://forums.autodesk.com/t5/objectarx-forum/custom-acdbentity-contain-blockreference-subgetosnappoints-error/m-p/11646092#M2003</link>
    <description>Dear&amp;nbsp;daniel,&lt;BR /&gt;&lt;BR /&gt;thanks your help!&amp;nbsp;it's works .&lt;BR /&gt;&lt;BR /&gt;i only call this method:&amp;nbsp;ref.getOsnapPoints(osnapMode, gsSelectionMark, _pickPoint, _lastPoint, viewXform, snapPoints, geomIds, xform);&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;</description>
    <pubDate>Thu, 29 Dec 2022 03:23:09 GMT</pubDate>
    <dc:creator>mengxiangge</dc:creator>
    <dc:date>2022-12-29T03:23:09Z</dc:date>
    <item>
      <title>Custom AcDbEntity Contain BlockReference subGetOsnapPoints Error</title>
      <link>https://forums.autodesk.com/t5/objectarx-forum/custom-acdbentity-contain-blockreference-subgetosnappoints-error/m-p/11643320#M2001</link>
      <description>&lt;P&gt;Dear developer:&lt;/P&gt;&lt;P&gt;&amp;nbsp; I have create create a custom entity which contain a&amp;nbsp;AcDbBlockReference.&lt;/P&gt;&lt;P&gt;when i located it at origin(0,0,0), its osnap is right ,contain&amp;nbsp;kOsModeNear and&amp;nbsp;kOsModePerp.&lt;/P&gt;&lt;P&gt;but when i move the entity ,its snap begin make some error which its&amp;nbsp;&amp;nbsp;kOsModeNear and&amp;nbsp;kOsModePerp osnap is not effect.&lt;/P&gt;&lt;P&gt;&amp;nbsp; please tell me the reason which make this problem and tell me the way how to get the right osnap.&lt;/P&gt;&lt;P&gt;&amp;nbsp; i have attach a git from which you can know the error clearly.&lt;/P&gt;&lt;P&gt;&amp;nbsp; the code block is blow&lt;/P&gt;&lt;LI-CODE lang="general"&gt;// .h
class AsdkBlockReference : public AcDbEntity
{
public:
	ACRX_DECLARE_MEMBERS(AsdkBlockReference);
	AsdkBlockReference();
	~AsdkBlockReference();
	std::shared_ptr&amp;lt;AcDbBlockReference&amp;gt; mBlock_reference;
	AcGePoint3d mOrigin;
	AcGeMatrix3d mMatrix3d;
protected:
	virtual Adesk::Boolean  subWorldDraw(AcGiWorldDraw*);
	Acad::ErrorStatus       subTransformBy(const AcGeMatrix3d&amp;amp;);
	virtual Acad::ErrorStatus subGetOsnapPoints(AcDb::OsnapMode     osnapMode,
		Adesk::GsMarker     gsSelectionMark,
		const AcGePoint3d&amp;amp; pickPoint,
		const AcGePoint3d&amp;amp; lastPoint,
		const AcGeMatrix3d&amp;amp; viewXform,
		AcGePoint3dArray&amp;amp; snapPoints,
		AcDbIntArray&amp;amp; geomIds) const;
};
void addAsdkBlockReferenceObject();

// .cpp
#include "pch.h"
#include "AsdkBlockReference.h"

ACRX_DXF_DEFINE_MEMBERS_WITH_PROPERTIES(
    AsdkBlockReference, AcDbEntity,
    AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent,
    AcDbProxyEntity::kNoOperation,金地墙2,
    GemWallStyle Sample
    | Product Desc : A description for your object
    | Company : Your company name
    | WEB Address : Your company WEB site address,
    AsdkBlockReference::makeMembers
)
AcDbHandle AsdkBlockReference::mHandle = nullptr;

AsdkBlockReference::AsdkBlockReference()
{}

AsdkBlockReference::~AsdkBlockReference()
{}
Acad::ErrorStatus
AsdkBlockReference::subTransformBy(const AcGeMatrix3d&amp;amp; xfm)
{
    assertReadEnabled();
    mMatrix3d = xfm;
    if(mBlock_reference)
    {
        mBlock_reference-&amp;gt;transformBy(xfm);
    }
    return Acad::eOk;
}
Adesk::Boolean AsdkBlockReference::subWorldDraw(AcGiWorldDraw* pW)
{
    assertReadEnabled();
    pW-&amp;gt;geometry().draw(mBlock_reference-&amp;gt;drawable());
    return Adesk::kTrue;
}
Acad::ErrorStatus AsdkBlockReference::subGetOsnapPoints(AcDb::OsnapMode     osnapMode,
    Adesk::GsMarker     gsSelectionMark,
    const AcGePoint3d&amp;amp; pickPoint,
    const AcGePoint3d&amp;amp; lastPoint,
    const AcGeMatrix3d&amp;amp; viewXform,
    AcGePoint3dArray&amp;amp; snapPoints,
    AcDbIntArray&amp;amp; geomIds) const
{
    auto ima = mMatrix3d.inverse();;
    auto pickBasePoint = const_cast&amp;lt;AcGePoint3d&amp;amp;&amp;gt;(pickPoint).transformBy(ima);

    auto lastBasePoint = const_cast&amp;lt;AcGePoint3d&amp;amp;&amp;gt;(lastPoint).transformBy(ima);
    return mBlock_reference-&amp;gt;getOsnapPoints(osnapMode, gsSelectionMark, pickBasePoint, lastBasePoint, viewXform, snapPoints, geomIds);
}
void addAsdkBlockReferenceObject()
{
    ads_name      ename, sset;
    if (RTNORM == acedSSGet(NULL, NULL, NULL, NULL, sset))
    {
        struct resbuf* rb;
        if (acedSSNameX(&amp;amp;rb, sset, 0) != RTNORM)
        {
            acedSSFree(sset);
            return;
        }
        if (rb == NULL || rb-&amp;gt;restype != RTLB)
        {
            assert(0);
            return ;
        }
        rb = rb-&amp;gt;rbnext; // Bump up to the selection method, always after RTLB.
        rb = rb-&amp;gt;rbnext; // Bump up to the first name, always after sel method.
        ename[0] = rb-&amp;gt;resval.rlname[0];
        ename[1] = rb-&amp;gt;resval.rlname[1];

        AcDbEntity* ent = NULL;
        AcDbObjectId polyId;
        acdbGetObjectId(polyId, ename);
        auto t = acdbOpenAcDbEntity(ent, polyId, AcDb::kForRead);        
    	auto tBlock = static_cast&amp;lt;AcDbBlockReference*&amp;gt;(ent);
        auto tBlockRecordId = tBlock-&amp;gt;blockTableRecord();
        ent-&amp;gt;close();

        AsdkBlockReference* pNewObj = new AsdkBlockReference;
        pNewObj-&amp;gt;mOrigin = AcGePoint3d(0, 0, 0);
        auto pShareBlock = std::make_shared&amp;lt;AcDbBlockReference&amp;gt;(
            pNewObj-&amp;gt;mOrigin, tBlockRecordId);
        pNewObj-&amp;gt;mBlock_reference = pShareBlock;
        AcDbBlockTable* pBlockTable;
        acdbHostApplicationServices()-&amp;gt;workingDatabase()
            -&amp;gt;getSymbolTable(pBlockTable, AcDb::kForRead);

        AcDbBlockTableRecord* pBlock;
        pBlockTable-&amp;gt;getAt(ACDB_MODEL_SPACE, pBlock,
            AcDb::kForWrite);

        AcDbObjectId objId;
        auto es=pBlock-&amp;gt;appendAcDbEntity(objId, pNewObj);

        pNewObj-&amp;gt;recordGraphicsModified();    
        pBlock-&amp;gt;close();
        pBlockTable-&amp;gt;close();
        pNewObj-&amp;gt;close(); 
    }   
}&lt;/LI-CODE&gt;</description>
      <pubDate>Tue, 27 Dec 2022 11:28:26 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/objectarx-forum/custom-acdbentity-contain-blockreference-subgetosnappoints-error/m-p/11643320#M2001</guid>
      <dc:creator>mengxiangge</dc:creator>
      <dc:date>2022-12-27T11:28:26Z</dc:date>
    </item>
    <item>
      <title>Re: Custom AcDbEntity Contain BlockReference subGetOsnapPoints Error</title>
      <link>https://forums.autodesk.com/t5/objectarx-forum/custom-acdbentity-contain-blockreference-subgetosnappoints-error/m-p/11645020#M2002</link>
      <description>&lt;P&gt;I was able to get a sample to work,&lt;/P&gt;&lt;P&gt;there's another subGetOsnapPoints to override. it's weird that&amp;nbsp; just returning&lt;/P&gt;&lt;P&gt;ref.getOsnapPoints(osnapMode, gsSelectionMark, _pickPoint, _lastPoint, viewXform, snapPoints, geomIds, xform); doesn't work.&lt;/P&gt;&lt;P&gt;Anyway if this seems to work, hope it helps. maybe someone with more knowledge can help&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 28 Dec 2022 12:47:06 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/objectarx-forum/custom-acdbentity-contain-blockreference-subgetosnappoints-error/m-p/11645020#M2002</guid>
      <dc:creator>daniel_cadext</dc:creator>
      <dc:date>2022-12-28T12:47:06Z</dc:date>
    </item>
    <item>
      <title>Re: Custom AcDbEntity Contain BlockReference subGetOsnapPoints Error</title>
      <link>https://forums.autodesk.com/t5/objectarx-forum/custom-acdbentity-contain-blockreference-subgetosnappoints-error/m-p/11646092#M2003</link>
      <description>Dear&amp;nbsp;daniel,&lt;BR /&gt;&lt;BR /&gt;thanks your help!&amp;nbsp;it's works .&lt;BR /&gt;&lt;BR /&gt;i only call this method:&amp;nbsp;ref.getOsnapPoints(osnapMode, gsSelectionMark, _pickPoint, _lastPoint, viewXform, snapPoints, geomIds, xform);&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;</description>
      <pubDate>Thu, 29 Dec 2022 03:23:09 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/objectarx-forum/custom-acdbentity-contain-blockreference-subgetosnappoints-error/m-p/11646092#M2003</guid>
      <dc:creator>mengxiangge</dc:creator>
      <dc:date>2022-12-29T03:23:09Z</dc:date>
    </item>
  </channel>
</rss>

