기본 콘텐츠로 건너뛰기

라벨이 Text인 게시물 표시

[EYESHOT] BlockReference의 Attribute를 Text로 생성

두 도면 비교를 쉽게 하기 위해 BlockReference를 Explode 시키기로 했습니다. Attribute를 제외한 다른 항목들은 Expolode한 결과를 그대로 사용하면 되는데 Attribute는 Explode한 결과가 Explode하기 전과 달랐습니다. 이를 해결하기 위해 여러 방법을 시도해 봤는데 그 결과가 만족스럽지 못했습니다. Explode한 Attribute의 수가 화면에 보이는(Explode하기 전의) 수와 다를 경우도 있고, Attribute의 TAG를 찾지 못하는 경우도 있었습니다. 여러 방법을 시도하는 중 가장 합리적인 방법을 찾았습니다. 아래는 Attribute에 대응하는 Text를 생성하는 방법입니다. var attributes = blkref.Attributes.Where(x => x.Value.Visible).ToList(); foreach(var attr in attributes) { var pt = attr.Value.InsertionPoint.Clone() as devDept.Geometry.Point3D; var plane = attr.Value.Plane.Clone() as devDept.Geometry.Plane; string TextString = attr.Value.Value; #region 특수 문자 처리 TextString = TextString.Replace("%%", string.Empty); #endregion var txt = new Text(plane, pt, TextString, attr.Value.Height) { LayerName = LayerName, Color = color != Color.Empty ? color : GetAttributeColor(Layers, GetEntColor(Layers, blkref), attr.Value) ColorMethod =...

[AutoCAD] 영역에 속한 텍스트 구하기

  프로그램에서 사용하는 속성 영역(min x, min y, max x, max y)을 설정 후 해당 영역에 들어가는 텍스트를 구하는 문제입니다. 일반적인 경우에는 AutoCAD database에서 텍스트들에 대해 좌표를 구한 후 해당 영역에 포함되는지 확인하면 됩니다. 문제가 되는 경우는 우리가 구하려고 하는 텍스트가 블럭에 있는 경우입니다. 이 경우에 대응하는 방법은 아래와 같이 생각해 볼 수 있습니다. 제안 1) 블럭과 블럭안의 Attribute를 화면에 보여주고 사용자로 하여금 프로그램 속성 영역과 매핑하도록 하는 방법입니다. 텍스트 좌표를 구할 필요도 없고 간단한것 같습니다. 하지만 사용자는 매핑해야하는 번거로움과 다수의 업체에서 제공되는 AutoCAD의 블럭이 모두 같다는 보장이 없기 때문에 매 도면마다 매핑을 해야하는 문제가 있습니다. 사용자들이 좋아하지 않는 방법입니다. 제안 2) 블럭을 explode 한 후 텍스트들에 대한 좌표를 구해 영역에 포함되는지 확인하는 방법입니다. AutoCAD의 explode 명령은 사용하지 않는게 좋을것 같습니다. Explode는 블럭을 깨어서 블럭 안의 entity들을 AutoCAD database에 저장합니다. 이 과정에서 눈에 보이지 않는/원하지 않는 요소들이 database에 저장되는 문제가 있습니다. 그리고 원본 도면이 훼손되는 문제가 있어 추천하지 않는 방법입니다. 이와 유사한 burst라는 명령어도 있다고 합니다.(관심있는 분은 인터넷에서 검색해 보세요) 그럼 어떻게 할까요? AutoCAD API를 보면 Explode 함수가 있습니다. Explode 명령어와 이름과 하는 일은 같지만 Explode 함수는 블럭안에 있는 entity들을 단지 되돌려줄 뿐입니다.(database에 저장하지 않습니다.) 이 후의 텍스트를 처리하는 과정과 같이 하면 됩니다. 제안 3) 블럭과 블럭안이 Attribute들을 구하는 방식입니다. 블럭의 좌표와 Attribute의 좌표를 합하여 실제 눈에 보이는 위치를 구할 ...

선택한 Text의 정보 출력

선택한 Text의 정보를 출력하는 예제입니다. Sub DisplaySelTextElement() Dim cim As CadInputMessage Dim oEnumerator As ElementEnumerator If Not ActiveModelReference.AnyElementsSelected Then ShowError "The macro requires a selection set" Exit Sub End If Set oEnumerator = ActiveModelReference.GetSelectedElements Do While oEnumerator.MoveNext Dim oElement As Element Set oElement = oEnumerator.Current If oElement.Type = msdElementTypeText Then ShowStatus oElement.AsTextElement.Text End If Loop End Sub

mdlText_createWide 함수

mdlText_create대신 mdlText_createWide를 사용하는 가장 큰 이유는 텍스트의 기울기를 줄수 있기 때문이다. int mdlText_createWide ( MSElementUnion *out, /* template element */ MSWideChar *wString, /* => wide character string */ Dpoint3d *userOrigin, /* => origin (or NULL) */ RotMatrix *rMatrix, /* => rotation matrix (or NULL) */ TextSizeParam *textSize, /* => size (or NULL) */ TextParamWide *txtParamWide, /* => parameters (or NULL) */ TextEDParam *edParam /* => enter data info (or NULL) */ ); mbstowcs 함수를 통하여 char*를 MSWideChar*로 변환시킬 수 있습니다. 여기서 한가지 주의해야 할 것은 txtParamWide의 flag들의 속성을 제대로 설정해주어야 한다는 것이다. 예를 들어 txtParamWide.flags.vertical을 FALSE로 하지 않으면 텍스트들이 Vertical 방향으로 쓰여지게 된다. txtParamWide.flags.vertical을 FALSE로 두고 텍스트의 회전은 rMatrix에서 설정을 하면 된다. 이번 프로젝트에서 이 문제로 인해 며칠동안 고민을 했었습니다.