59014


.net APIに関する質問です。

ブロック参照のクリップ範囲を取得する際に、  
GrxCAD.DatabaseServices.Filters.SpatialFilterDefinition.GetPoints()  
(※1)で取得していますが、クリップの設定により下記の通り挙動が変わります。

※1
（[外部参照クリップ境界の座標値を取得する方法](https://ja.stackoverflow.com/questions/57200/%e5%a4%96%e9%83%a8%e5%8f%82%e7%85%a7%e3%82%af%e3%83%aa%e3%83%83%e3%83%97%e5%a2%83%e7%95%8c%e3%81%ae%e5%ba%a7%e6%a8%99%e5%80%a4%e3%82%92%e5%8f%96%e5%be%97%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95)）参照

①プログラムでクリップを設定(※2)した場合：  
ブロック座標系でのクリップ範囲の座標値を返す。  
※2下記ソースコード参照

[code]

    Imports Autodesk.AutoCAD.Runtime
    Imports Autodesk.AutoCAD.ApplicationServices
    Imports Autodesk.AutoCAD.DatabaseServices
    Imports Autodesk.AutoCAD.Geometry
    
    <CommandMethod("ClippingExternalReference")> _
    Public Sub ClippingExternalReference()
        ' Get the current database and start a transaction
        Dim acCurDb As Autodesk.AutoCAD.DatabaseServices.Database
        acCurDb = Application.DocumentManager.MdiActiveDocument.Database
    
        Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
            ' Create a reference to a DWG file
            Dim PathName As String = "C:\AutoCAD\Sample\Sheet Sets\Architectural\Res\Exterior Elevations.dwg"
            Dim acXrefId As ObjectId = acCurDb.AttachXref(PathName, "Exterior Elevations")
    
            ' If a valid reference is created then continue
            If Not acXrefId.IsNull Then
                ' Attach the DWG reference to the current space
                Dim insPt As New Point3d(1, 1, 0)
                Using acBlkRef As New BlockReference(insPt, acXrefId)
    
                    Dim acBlkTblRec As BlockTableRecord
                    acBlkTblRec = acTrans.GetObject(acCurDb.CurrentSpaceId, OpenMode.ForWrite)
    
                    acBlkTblRec.AppendEntity(acBlkRef)
                    acTrans.AddNewlyCreatedDBObject(acBlkRef, True)
    
                    MsgBox("The external reference is attached.")
    
                    Dim mat As Matrix3d = acBlkRef.BlockTransform
                    mat.Inverse()
    
                    Dim ptCol As New Point2dCollection
    
                    ' Define the first corner of the clipping boundary
                    Dim pt3d As New Point3d(-330, 400, 0)
                    pt3d.TransformBy(mat)
                    ptCol.Add(New Point2d(pt3d.X, pt3d.Y))
    
                    ' Define the second corner of the clipping boundary
                    pt3d = New Point3d(1320, 1120, 0)
                    pt3d.TransformBy(mat)
                    ptCol.Add(New Point2d(pt3d.X, pt3d.Y))
    
                    ' Define the normal and elevation for the clipping boundary 
                    Dim normal As Vector3d
                    Dim elev As Double = 0
    
                    If acCurDb.TileMode = True Then
                        normal = acCurDb.Ucsxdir.CrossProduct(acCurDb.Ucsydir)
                        elev = acCurDb.Elevation
                    Else
                        normal = acCurDb.Pucsxdir.CrossProduct(acCurDb.Pucsydir)
                        elev = acCurDb.Pelevation
                    End If
    
                    ' Set the clipping boundary and enable it
                    Using filter As New Filters.SpatialFilter
                        Dim filterDef As New Filters.SpatialFilterDefinition(ptCol, normal, elev, 0, 0, True)
                        filter.Definition = filterDef
    
                        ' Define the name of the extension dictionary and entry name
                        Dim dictName As String = "ACAD_FILTER"
                        Dim spName As String = "SPATIAL"
    
                        ' Check to see if the Extension Dictionary exists, if not create it
                        If acBlkRef.ExtensionDictionary.IsNull Then
                            acBlkRef.UpgradeOpen()
                            acBlkRef.CreateExtensionDictionary()
                            acBlkRef.DowngradeOpen()
                        End If
    
                        ' Open the Extension Dictionary for write
                        Dim extDict As DBDictionary = acTrans.GetObject(acBlkRef.ExtensionDictionary, OpenMode.ForWrite)
    
                        ' Check to see if the dictionary for clipped boundaries exists, 
                        ' and add the spatial filter to the dictionary
                        If extDict.Contains(dictName) Then
                            Dim filterDict As DBDictionary = acTrans.GetObject(extDict.GetAt(dictName), OpenMode.ForWrite)
    
                            If (filterDict.Contains(spName)) Then filterDict.Remove(spName)
    
                            filterDict.SetAt(spName, filter)
                        Else
                            Using filterDict As New DBDictionary
                                extDict.SetAt(dictName, filterDict)
    
                                acTrans.AddNewlyCreatedDBObject(filterDict, True)
                                filterDict.SetAt(spName, filter)
                            End Using
                        End If
    
                        ' Append the spatial filter to the drawing
                        acTrans.AddNewlyCreatedDBObject(filter, True)
                    End Using
                End Using
    
                MsgBox("The external reference is clipped.")
            End If
    
            ' Save the new objects to the database
            acTrans.Commit()
    
            ' Dispose of the transaction
        End Using
    End Sub
    
[/code]

（参照元：<https://knowledge.autodesk.com/ja/search-
result/caas/CloudHelp/cloudhelp/2016/JPN/AutoCAD-
NET/files/GUID-72029044-0840-4187-9A58-F2A4518E3A23-htm.html>）

②IJCADのXCLIPでクリップを設定した場合：  
全体座標系でのクリップ範囲の座標値を返す。

これはプログラミングに問題があるのでしょうか？

開発環境はVisual Staudio VB.net、IJCAD2016です。

お手数ですが、情報提供いただけますと助かります。


CC BY-SA 4.0
2019-09-10T10:16:44.853
57965
2019-09-25T06:41:57.273
34508
question
.net vb.net ijcad
外部参照クリップ境界の座標値の取得結果について


Autodeskのサンプルコードを元にして作成したコマンドで外部参照を作成し、外部参照からSpatialFilterDefinition.GetPointsメソッドでクリップ範囲の座標点を取得してコマンドラインに出力してみましたが、AutoCADもIJCADもブロック座標系での座標値が返されました。

Clip point = (-331,399)  
Clip point = (1319,1119)

恐らくプログラミングに問題があると思いますので、クリップ範囲の座標系を取得しているコードに、問題が無いかどうか見直してみてはいかがでしょうか。

AutoCAD  
[![画像の説明をここに入力](https://i.stack.imgur.com/HUbxl.png)](https://i.stack.imgur.com/HUbxl.png)

IJCAD  
[![画像の説明をここに入力](https://i.stack.imgur.com/8t2rg.png)](https://i.stack.imgur.com/8t2rg.png)

追記：  
SpatialFilter.OriginalInverseBlockTransformプロパティで、Filterが最後に設定されたときに関連付けられたブロック変換を取得できますので、これで全体座標系かブロック座標系か判断できると思います。


CC BY-SA 4.0
2019-09-12T07:40:59.193
59014
2019-09-25T06:41:57.273
2019-09-25T06:41:57.273
57965
answer