If the area you want to calculate is based on user specified points, you might consider creating an in memory object such as a lightweight polyline, and then query of the area of the object before discarding it. The following steps explain how you might accomplish this:
Calculate the area defined by points entered from the user
This example prompts the user to enter five points. A polyline is then created out of the points entered. The polyline is closed, and the area of the polyline is displayed in a message box. Since the polyline is not added to a block, it needs to be disposed before the command ends.
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Geometry
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.Runtime
<CommandMethod("CalculateDefinedArea")> _
Public Sub CalculateDefinedArea()
'' Prompt the user for 5 points
Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
Dim pPtRes As PromptPointResult
Dim colPt As Point2dCollection = New Point2dCollection
Dim pPtOpts As PromptPointOptions = New PromptPointOptions("")
'' Prompt for the first point
pPtOpts.Message = vbLf & "Specify first point: "
pPtRes = acDoc.Editor.GetPoint(pPtOpts)
colPt.Add(New Point2d(pPtRes.Value.X, pPtRes.Value.Y))
'' Exit if the user presses ESC or cancels the command
If pPtRes.Status = PromptStatus.Cancel Then Exit Sub
Dim nCounter As Integer = 1
While (nCounter <= 4)
'' Prompt for the next points
Select Case nCounter
Case 1
pPtOpts.Message = vbLf & "Specify second point: "
Case 2
pPtOpts.Message = vbLf & "Specify third point: "
Case 3
pPtOpts.Message = vbLf & "Specify fourth point: "
Case 4
pPtOpts.Message = vbLf & "Specify fifth point: "
End Select
'' Use the previous point as the base point
pPtOpts.UseBasePoint = True
pPtOpts.BasePoint = pPtRes.Value
pPtRes = acDoc.Editor.GetPoint(pPtOpts)
colPt.Add(New Point2d(pPtRes.Value.X, pPtRes.Value.Y))
If pPtRes.Status = PromptStatus.Cancel Then Exit Sub
'' Increment the counter
nCounter = nCounter + 1
End While
'' Create a polyline with 5 points
Using acPoly As Polyline = New Polyline()
acPoly.AddVertexAt(0, colPt(0), 0, 0, 0)
acPoly.AddVertexAt(1, colPt(1), 0, 0, 0)
acPoly.AddVertexAt(2, colPt(2), 0, 0, 0)
acPoly.AddVertexAt(3, colPt(3), 0, 0, 0)
acPoly.AddVertexAt(4, colPt(4), 0, 0, 0)
'' Close the polyline
acPoly.Closed = True
'' Query the area of the polyline
Application.ShowAlertDialog("Area of polyline: " & _
acPoly.Area.ToString())
'' Dispose of the polyline
End Using
End Sub
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
[CommandMethod("CalculateDefinedArea")]
public static void CalculateDefinedArea()
{
// Prompt the user for 5 points
Document acDoc = Application.DocumentManager.MdiActiveDocument;
PromptPointResult pPtRes;
Point2dCollection colPt = new Point2dCollection();
PromptPointOptions pPtOpts = new PromptPointOptions("");
// Prompt for the first point
pPtOpts.Message = "\nSpecify first point: ";
pPtRes = acDoc.Editor.GetPoint(pPtOpts);
colPt.Add(new Point2d(pPtRes.Value.X, pPtRes.Value.Y));
// Exit if the user presses ESC or cancels the command
if (pPtRes.Status == PromptStatus.Cancel) return;
int nCounter = 1;
while (nCounter <= 4)
{
// Prompt for the next points
switch(nCounter)
{
case 1:
pPtOpts.Message = "\nSpecify second point: ";
break;
case 2:
pPtOpts.Message = "\nSpecify third point: ";
break;
case 3:
pPtOpts.Message = "\nSpecify fourth point: ";
break;
case 4:
pPtOpts.Message = "\nSpecify fifth point: ";
break;
}
// Use the previous point as the base point
pPtOpts.UseBasePoint = true;
pPtOpts.BasePoint = pPtRes.Value;
pPtRes = acDoc.Editor.GetPoint(pPtOpts);
colPt.Add(new Point2d(pPtRes.Value.X, pPtRes.Value.Y));
if (pPtRes.Status == PromptStatus.Cancel) return;
// Increment the counter
nCounter = nCounter + 1;
}
// Create a polyline with 5 points
using (Polyline acPoly = new Polyline())
{
acPoly.AddVertexAt(0, colPt[0], 0, 0, 0);
acPoly.AddVertexAt(1, colPt[1], 0, 0, 0);
acPoly.AddVertexAt(2, colPt[2], 0, 0, 0);
acPoly.AddVertexAt(3, colPt[3], 0, 0, 0);
acPoly.AddVertexAt(4, colPt[4], 0, 0, 0);
// Close the polyline
acPoly.Closed = true;
// Query the area of the polyline
Application.ShowAlertDialog("Area of polyline: " +
acPoly.Area.ToString());
// Dispose of the polyline
}
}