TheSwamp

Code Red => VB(A) => Topic started by: Humbertogo on September 28, 2006, 06:50:23 AM

Title: ObjectDBX
Post by: Humbertogo on September 28, 2006, 06:50:23 AM
is there a way to read some systemvariables with ObjectDBX?
Title: Re: ObjectDBX
Post by: Jeff_M on September 28, 2006, 01:07:06 PM
no....not that I'm aware of :(
Title: Re: ObjectDBX
Post by: FengK on September 28, 2006, 01:20:49 PM
I vaguely remember it returns the system variables from current drawing in which your code is excuted (could be wrong).
Suggestion: Store the system variables that you're interested in in a custom dictionary or attach as xdata to some objects in the drawing and later you can access them via objectdbx.
Title: Re: ObjectDBX
Post by: deegeecees on September 28, 2006, 02:31:50 PM
Since ObjectDBX is most useful with unopened drawings, and AutoCADs' System Variables are either stored in the drawing or at the application level, why (if I may be so bold to ask) would you want to read them?

Just wondering what you're trying to do.
Title: Re: ObjectDBX
Post by: Humbertogo on September 28, 2006, 05:22:47 PM
I need to check is the drawing is metric or imperial.
AutoCAD System Variables Measurement

0 is Imperial
1 is Metric
be for open or insert the files as block
Title: Re: ObjectDBX
Post by: Fatty on September 29, 2006, 05:59:24 AM
I need to check is the drawing is metric or imperial.
AutoCAD System Variables Measurement

0 is Imperial
1 is Metric
be for open or insert the files as block
Not sure exactly but I think this will be impossible
do doing with ObjectDBX method IMHO
Try this instead:

Code: [Select]
Option Explicit

Public Function GetVars(selfiles As Variant, sysVarName As String) As Variant


Dim fName As String
Dim acdoc As AcadDocument
Dim sysvar() As Variant
Dim m As Integer

For m = 0 To UBound(selfiles)
fName = selfiles(m)

Set acdoc = Application.Documents.Open(fName, True)
ReDim Preserve sysvar(m)
sysvar(m) = acdoc.GetVariable(sysVarName)
acdoc.Close
Next m

GetVars = sysvar

End Function
Public Sub FindFile(ByRef files As Collection, strDir, strExt)

  Dim strFileName
  If (Right(strDir, 1) <> "\") Then
    strDir = strDir & "\"
  End If
  strFileName = Dir(strDir & "*.*", vbDirectory)
  Do While (strFileName <> "")
    If (UCase(Right(strFileName, 3)) = UCase(strExt)) Then
      files.Add strDir & strFileName
    End If
  strFileName = Dir
  Loop
 
End Sub
Sub Test()
Dim dmod
dmod = ThisDrawing.GetVariable("SDI")
If dmod <> 0 Then
ThisDrawing.SetVariable "SDI", 0
End If
Dim path As String
path = "D:\AUTOLISP\LISPS\PRIMITIVES\#FILE&S\PURGE" '' change your path here
Dim collFiles As New Collection
Call FindFile(collFiles, path, "DWG")
Dim i As Integer
ReDim selfiles(collFiles.Count - 1) As String
For i = 1 To collFiles.Count
selfiles(i - 1) = collFiles.Item(i)
Next
Dim sysvar() As Variant
sysvar = GetVars(selfiles, "measurement")

ThisDrawing.SetVariable "SDI", dmod

Dim dataVar(999, 1) As Variant
For i = 0 To UBound(sysvar)
dataVar(i, 0) = selfiles(i)
dataVar(i, 1) = sysvar(i)
Next

End Sub

Fatty

~'J'~
Title: Re: ObjectDBX
Post by: Chuck Gabriel on September 29, 2006, 07:56:51 AM
What version of AutoCAD are you using?
Title: Re: ObjectDBX
Post by: Humbertogo on September 29, 2006, 09:04:32 AM
I use Autocad mechanical 2006
Title: Re: ObjectDBX
Post by: Chuck Gabriel on September 29, 2006, 10:53:04 AM
In that case, I think there is a way you can do it through the .NET API using C# or VB.NET.

Are you interested in giving it a try?
Title: Re: ObjectDBX
Post by: Humbertogo on September 29, 2006, 11:06:24 AM
Quote
Are you interested in giving it a try?

oh yes I'm
Title: Re: ObjectDBX
Post by: Chuck Gabriel on September 29, 2006, 11:13:08 AM
Give me a little time to formulate something, and I'll post back with some starter code.
Title: Re: ObjectDBX
Post by: Chuck Gabriel on September 29, 2006, 12:01:29 PM
This C# code should get you started.  I translated this from some similar C++ code of mine, but hopefully the .NET gurus will come along and point out anything stupid I may have done.

Code: [Select]
using System;
using System.IO;
using System.Text;

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;

namespace MetricOrImperial
{
    public class Main
    {
        public static int metricOrImperial(string fileName)
        {
            if(!File.Exists(fileName)) return -1;
            Database db = new Database(false, true);
            try
            {
                db.ReadDwgFile(fileName, System.IO.FileShare.Read, false, string.Empty);
                return db.Measurement == MeasurementValue.English ? 1 : 0;
            }
            catch (Exception e)
            {
                Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(e.ToString());
                return -1;
            }
        }
    }
}
Title: Re: ObjectDBX
Post by: Humbertogo on September 29, 2006, 12:22:50 PM
thanks Chuck Gabriel
Title: Re: ObjectDBX
Post by: Chuck Gabriel on September 29, 2006, 12:33:43 PM
You're welcome.

By the way, I think I got the return values backwards (assuming you want to follow the convention of the MEASUREMENT system variable).  It should return 0 for English and 1 for Imperial.
Title: Re: ObjectDBX
Post by: Humbertogo on September 29, 2006, 01:54:44 PM
The AutoCAD System Variables Measurement  is the autocad way i think
for  Autocad Mechanical i wrote  this function

and  will try to convert this function in a C# code

Public Function Mcad_StandardIsMetric() As Boolean
Set symbb = ThisDrawing.Application.GetInterfaceObject("SymBBAuto.McadSymbolBBMgr")
Set Ge = ThisDrawing.Application.GetInterfaceObject("Ge.Application")
Set stdmgr = symbb.StandardMgr
'------------------------------------------------------------
Set currStand = stdmgr.CurrentStandard
 Mcad_StandardIsMetric = currStand.IsMetric
End Function
Title: Re: ObjectDBX
Post by: Chuck Gabriel on September 29, 2006, 02:35:26 PM
Sorry you couldn't use what I posted.  Maybe somebody else will find it useful.
Title: Re: ObjectDBX
Post by: Kerry on September 29, 2006, 03:34:06 PM
I'm sure they will Chuck .. :lol:
Title: Re: ObjectDBX
Post by: Humbertogo on October 04, 2006, 02:10:40 AM
his solution is using the ReadDwg() method    :-D   

                                           Editor editor = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
         Database db = new Database();
         db.ReadDwgFile("c:\\test.dwg",System.IO.FileShare.ReadWrite,true,""); //make sure drawing exists
                                                db.Measurement
                                               
Title: Re: ObjectDBX
Post by: MikeJarosz on October 27, 2006, 06:46:15 PM
Since ObjectDBX is most useful with unopened drawings, and AutoCADs' System Variables are either stored in the drawing or at the application level, why (if I may be so bold to ask) would you want to read them?

Just wondering what you're trying to do.

The question wasn't specific to Acad. The Windows environment variables can be very useful to a programmer. The user's name, machine ID, login time and a wealth of other info can be determined from the environment. I regularly write logfiles from my applications, and I include the user, the application, date, time etc in the log file. Some of this info can only be obtained from the environment. And the user doesn't have to know your doing it!

I'm not sure Acad variables can be changed in objDBX, since I only started usingDBX. But in Acad VBA, I regularly read and alter Acad variables. For example the units can be set or reset, the precision determined, snaps turned on and off. I'd be lost without this ability.