Hello Everyone
How can i change or set the Position Z of a block in autocad to 0 by using .net vb or c#
please help
Thankyou
Solved! Go to Solution.
Solved by imagination_s. Go to Solution.
Hi,
See the documentation (or google) on Entity.TransformBy method
Gaston Nunez
So far i want to set every entity Position Z to 0
So my code looks like this
<CommandMethod("changeme", CommandFlags.UsePickSet Or CommandFlags.Redraw)> _
Public Shared Sub testchange()
Dim doc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
Dim ed As Editor = doc.Editor
Dim db As Database = doc.Database
Dim rb As New ResultBuffer()
Try
rb.Add(New TypedValue(5005, "_Zoom"))
rb.Add(New TypedValue(5005, "_Extents"))
acedCmd(rb.UnmanagedObject)
Dim ucs As Matrix3d = ed.CurrentUserCoordinateSystem
Dim ccos As CoordinateSystem3d = ucs.CoordinateSystem3d
Dim orig As Point3d = ccos.Origin.TransformBy(Matrix3d.Identity)
' select all objects
Dim sset As SelectionSet = ed.SelectAll().Value
If sset Is Nothing Then
Return
End If
Dim mmx As New Matrix3d()
Using tr As Transaction = doc.TransactionManager.StartTransaction()
' iterate through selected objects
For Each id As ObjectId In sset.GetObjectIds()
Dim ent As Entity = DirectCast(tr.GetObject(id, OpenMode.ForWrite), Entity)
Dim ext As Extents3d = ent.GeometricExtents
Dim mp As Point3d = New Point3d(orig.X, orig.Y, 0).TransformBy(Matrix3d.Identity)
mmx = Matrix3d.Displacement(orig - mp)
'If ext = 0 Then
' Dim minpt As Point3d = ext.TransformBy(Matrix3d.Identity)
' collect entities to List for the future work
ent.TransformBy(mmx)
ent.UpgradeOpen()
'End If
Next
tr.Commit()
End Using
Catch ex As Autodesk.AutoCAD.Runtime.Exception
ed.WriteMessage((vbLf + ex.Message & vbLf) + ex.StackTrace)
Finally
rb = New ResultBuffer()
rb.Add(New TypedValue(5005, "_Zoom"))
rb.Add(New TypedValue(5005, "_Extents"))
acedCmd(rb.UnmanagedObject)
End Try
End Sub
Ok.So i explain it
First i want to get for each entity position origin X,Y,Z
next a create a new set of point based on originx,origin.y and set the Z to 0
now change the entity to my new points 3d
get transformby and upgrade open
So please tell me what i am doing wrong ?
Hi,
I think you have to use this work flow:
1.- Get your selection set
2.-Iterate the SS inside a transaction
3.-Get the position of the current entitie (say cEnt) in a Point3d variable (say BasePoint)
4.-Obtain a new Matrix3D displacement using:
Dim m3d as Matrix3d= new Matrix3D.Displacement(BasePoint.GetVectorTo(New Point3D(BasePoint.X,BasePoint.Y,0).TransformBy(UCS))
5.-Transform the current entitie using: cEnt.TransformBy(m3d)
6.-Commit the transaction
Gaston Nunez
Please tell me how do i
Get the position of the current entitie (say cEnt) in a Point3d variable (say BasePoint)
Hi,
If the entity it's a DBPoint, blockreference, mtext,text, table, and some others, they have a position property. I'm not sure about curve objects, maybe projecting them to the plane Z=0 should work, or just taking some point on the curve object (for circles the centerpoint property). I'm assuming that the objects are in different z position, if they (all) are in the same z, you can calculate the geometric extent of the selection set and move each entity using the min or max of the extents to obtain the transformation matrix.
Gaston Nunez
Hello,
Like you said ,it's a point so it must be DBPoint.
So a need to figure out how to get X<Y<Z coodonates of the Point
Hi,
This is a copy from the SDK docs about DBPoint:
This .NET class wraps the AcDbPoint ObjectARX class.
It represents the point entity within AutoCAD. A point entity has a position value to locate it in space. It also has a normal vector, which is used to determine its extrusion direction and to determine the plane on which to display the point's graphics if they are something other than a "." (the PDMODE system variable controls this display). The point entity has a thickness that is its "length" in the direction of its normal vector (that is, its extrusion length).
Gaston Nunez
Thankyou for your help 🙂
I figure it out how to get position Z from blok reference and rewrite it to 0
Here is my function
Public Sub Changeme()
Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
Dim acCurDb As Database = acDoc.Database
acDoc.LockDocument()
Dim values() As TypedValue = { _
New TypedValue(DxfCode.BlockName, "DOT")
}
Dim sfilter As New SelectionFilter(values)
Dim SelOpts As New PromptSelectionOptions()
SelOpts.MessageForAdding = "Select Block:"
SelOpts.AllowDuplicates = True
'Make the selection:
Dim res As PromptSelectionResult = ed.GetSelection(SelOpts, sfilter)
If Not res.Status = PromptStatus.OK Then Return
Dim SS As Autodesk.AutoCAD.EditorInput.SelectionSet = res.Value
Dim idarray As ObjectId() = SS.GetObjectIds()
Dim db As Database = Application.DocumentManager.MdiActiveDocument.Database
Dim tm As Autodesk.AutoCAD.DatabaseServices.TransactionManager = db.TransactionManager
Dim myT As Transaction = tm.StartTransaction()
Dim dwg As Document = CadApp.DocumentManager.MdiActiveDocument
Try
'Dim id As ObjectId
Dim ucs As Matrix3d = ed.CurrentUserCoordinateSystem
Dim cEnt As Entity
' For Each id In Entity
For Each id In idarray
cEnt = tm.GetObject(id, OpenMode.ForRead, False)
Dim bref As BlockReference = DirectCast(tm.GetObject(id, OpenMode.ForRead), BlockReference)
Dim x As Double
Dim y As Double
Dim z As Double
x = bref.Position.X
y = bref.Position.Y
z = -bref.Position.Z
Dim tMoveVec As Geometry.Vector3d = New Geometry.Vector3d(0, 0, z)
Dim m3d As Matrix3d
m3d = New Matrix3d
Dim tTransMat As Geometry.Matrix3d = Geometry.Matrix3d.Displacement(tMoveVec)
cEnt = tm.GetObject(id, OpenMode.ForWrite, True)
cEnt.Layer = "Converted"
cEnt.ColorIndex = 0
cEnt.UpgradeOpen()
' apply transformation matrix
cEnt.TransformBy(tTransMat)
Next
myT.Commit()
Finally
myT.Dispose()
End Try
End Sub
Can't find what you're looking for? Ask the community or share your knowledge.