2014-03-12 1 views
0

C#을 사용하여 기존 도면의 지정된 제목 블록에서 지정된 AcadAttribute의 위치를 ​​가져 오는 방법이 있습니까?C#의 AutoCad 블록 작업

편집 : 내 코드

AcadBlock myBlock = myAcadDoc.Database.Blocks.Items(block_Name); 

AcadAttribute myAtt; 
foreach(AcadEntity entity in myBlock) 
{ 
    myAtt = entity as AcadAttribute; 

    if(myAtt == null) continue; 

    if(myAtt.TagString == "Specified_String") 
    { 
     //Now i want to insert an image exactly where the myAtt attribute is exists 
     myAcadDoc.Database.ModelSpace.AddRoster("My image path", myAtt.Position /*myAtt does not have Position property*/, 50.0, 0) 
    } 
} 

내가 myAtt 속성이 존재하는 위치를 정확하게 이미지를 삽입하려면, 우는 소리 같은 것입니다, 그것은 내가 AcadAttribute의 위치를 ​​필요한 이유의 이유 .

+0

지금까지 어떤 노력을 했습니까? –

+0

나는 AcadAttribute 속성을 가지고 있으며 속성을 모두 확인했지만 그 중 아무 것도 위치를 반환하지 않습니다. –

+0

당신이 지금까지 얻은 것을 게시하십시오. 당신이 취하는 접근법을 보는 것이 유익 할 것입니다. 호기심 때문에 Interop을 통해이 작업을 수행하는 이유는 무엇입니까? –

답변

3

AutoDesk의 암호화 API가 약간의 트릭을주었습니다. 블록으로 작업 할 때 정의와 참조가 모두 있다는 것을 기억해야합니다. 정의는 블록을 만들 때 정의합니다. 속성을 포함하여 엔티티가 설명하는 내용을 말해줍니다. 해당 블록을 도면에 삽입하면 BlockReference가되며 Entity에서 상속됩니다. 귀하의 경우, 블록을 통과 할 때 AttributeReference에 관심이 있습니다. 정의 된 블록뿐만 아니라 모델 공간을 기준으로 위치가 중요하기 때문에 관심이 있습니다.

foreach (AcadEntity ent in doc.ModelSpace) 
{ 
    var block = ent as AcadBlockReference; 
    if (block == null || block.Name != block_Name) 
     continue; 

    foreach (AcadAttributeReference att in block.GetAttributes()) 
    { 
     if (att.TagString != "Specified_String") 
      continue; 

     doc.ModelSpace.AddRaster(
      @"C:\Users\Public\Pictures\Sample Pictures\Jellyfish.jpg", 
      att.InsertionPoint, 1, 0); 
     break; 
    } 
} 
+0

감사합니다. Locke, 내 솔루션이 될 수 있지만 약간 문제가 있습니다. doc.ModelSpace는 활성 문서의 블록 참조 만 포함하지만 활성 문서에 정의 된 블록은 포함하지 않습니다. 즉, 활성 객체는 활성 문서로 설정됩니다. –