Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
VFP9 with Autocad
Message
From
22/02/2010 14:38:41
 
General information
Forum:
Visual FoxPro
Category:
COM/DCOM and OLE Automation
Environment versions
Visual FoxPro:
VFP 9 SP2
OS:
Vista
Network:
Windows 2000 Pro
Database:
Visual FoxPro
Application:
Desktop
Miscellaneous
Thread ID:
01450104
Message ID:
01450317
Views:
57
I did some VFP-AutoCAD programming years ago. The bèta of VFP 9 was just
released then. The code Greg posted yesterday is very familiar te me...

The code below can be used to strip the preview-bitmap from a dwg file.
The comments are in Dutch but i think the code is easy enough to read.
A few months ago I discoverd that the AutoCAD 2010 fileformat has a slightly
larger bitmap. So the code may need some tweeking.

Start with an image baseclass en put the code in a new Preview method.
When calling the Preview method send the path+filename as parameter.
LPARAMETERS tcFileName

*!* LET OP !!
*!* Niet alle variabelen worden hier bovenin gedeclareerd. Om snelheidsredenen
*!* worden de variabelen die nodig zijn voor het maken van een Bitmap verderop
*!* in deze routine ingesteld.

LOCAL lcFileName
LOCAL lnFileHandle

lcFileName = ALLTRIM(tcFileName)
lnFileHandle = 0

*!* Voor de zekerheid controleren we hier of het bestand bestaat.

IF !FILE(lcFileName)
	THIS.cFileName = ""
	THIS.nACVersion = 0
	THIS.cACVersion = ""
	THIS.PictureVal	= FILETOSTR(goApp.cHomeDir + "framework\grafisch\geenvoorbeeld.bmp")
	RETURN
ENDIF

*!* Nu het bestand aanwezig lijkt te zijn,
*!* kunnen we er daadwerkelijk mee aan de slag.

*!* Eerst lezen we de versie uit. Is de versie lager dan 1014
*!* dan zit er geen Preview in het bestand.

THIS.cFileName = lcFileName
lnFileHandle = FOPEN(THIS.cFileName, 0)

= FREAD(lnFileHandle, 2)
THIS.nACVersion = VAL(FREAD(lnFileHandle, 4))

DO CASE
	CASE THIS.nACVersion = 1021
		THIS.cACVersion = "AutoCAD 2007"
	CASE THIS.nACVersion = 1018
		THIS.cACVersion = "AutoCAD 2004/2005/2006"
	CASE THIS.nACVersion = 1015
		THIS.cACVersion = "AutoCAD 2000/2000i/2002"
	CASE THIS.nACVersion = 1014
		THIS.cACVersion = "AutoCAD 14"
	CASE THIS.nACVersion = 1013
		THIS.cACVersion = "AutoCAD 14, Sample"
	CASE THIS.nACVersion = 1012
		THIS.cACVersion = "AutoCAD 13"
	CASE THIS.nACVersion = 1009
		THIS.cACVersion = "AutoCAD 11/12"
	CASE THIS.nACVersion = 1006
		THIS.cACVersion = "AutoCAD 10"
	CASE THIS.nACVersion = 1004
		THIS.cACVersion = "AutoCAD 9"
	OTHERWISE
		THIS.cACVersion = ""
ENDCASE

IF THIS.nACVersion < 1014
	THIS.PictureVal	= FILETOSTR("grafisch/geenvoorbeeld.bmp")
	= FCLOSE(lnFileHandle)
	RETURN
ENDIF

*!* Nu kan de Bitmap worden uitgelezen en afgebeeld.

LOCAL lnStartOfBitmap, lnNumberOfDescriptors, lnNum1
LOCAL lnDescriptorID, lnDescriptorStart, lnDescriptorLength
LOCAL lcBitmap
LOCAL lcFileHeaderType, lcFileSize, lcFileHeaderReserved1, lcFileHeaderReserved2, lcFileHeaderOffsetBits

lnStartOfBitmap = 0
lnNumberOfDescriptors = 0
lnNum1 = 0
lnDescriptorID = 0
lnDescriptorStart = 0
lnDescriptorLength = 0
lcBitmap = ""
lcFileHeaderType = ""
lcFileSize = ""
lcFileHeaderReserved1 = ""
lcFileHeaderReserved2 = ""
lcFileHeaderOffsetBits = ""

*!* Daar gaan we.....

= FSEEK(lnFileHandle, 13, 0)                                  && Pointer verplaatsen
lnStartOfBitmap = DWord2Num(FREAD(lnFileHandle, 4))           && Startlocatie van de Bitmap
= FREAD(lnFileHandle, lnStartOfBitmap - 17 + 16)              && Startlocatie is een absolute offset, dus de huidige
                                                              && positie (17 = 13 + 4) moet in mindering worden gebracht
                                                              && 16 Is de lengte van de header van de BMP. Doen we niks mee
= FREAD(lnFileHandle, 4)                                      && Pointer verplaatsen
lnNumberOfDescriptors = ASC(FREAD(lnFileHandle, 1))           && Aantal Descriptors aftappen
FOR lnNum1 = 1 TO lnNumberOfDescriptors                       && Loop door de Descriptors heen
	lnDescriptorID = ASC(FREAD(lnFileHandle, 1))              && de id,
	lnDescriptorStart = DWord2Num(FREAD(lnFileHandle, 4))     && dan de startpositie en
	lnDescriptorLength = DWord2Num(FREAD(lnFileHandle, 4))    && tenslotte de lengte aftappen
	IF lnDescriptorID = 2                                     && Indien Descriptor Type = 2 (de Bitmap zelf)
		EXIT                                                  && Exit de Loop en gebruik de gevonden startpositie en lengte
	ENDIF
ENDFOR

= FSEEK(lnFileHandle, lnDescriptorStart, 0)                   && Pointer naar begin van de Bitmap
lcBitMap = FREAD(lnFileHandle, lnDescriptorLength)

= FCLOSE(lnFileHandle)

*!* Nu gaan we de header voor de bitmap samenstellen.

lcFileHeaderType = Num2Word(19778)                 && Letters BM in de Header als identificatie
lcFileSize = Num2DWord(14 + lnDescriptorLength)    && grootte van het bestand (header + bitmap zelf)
lcFileHeaderReserved1 = Num2Word(0)                && geen betekenis
lcFileHeaderReserved2 = Num2Word(0)                && geen betekenis
lcFileHeaderOffsetBits = Num2DWord(1078)           && offset naar begin van de feitelijke bitmap
                                                   && de waarde 1078 is een aanname die "altijd" klopt.

*!* Tenslotte de bitmap samenstellen uit de verschillende onderdelen van
*!* de header en de bitmap zelf die uit de AutoCAD-tekening is geript en
*!* gelijk in de preview afbeelden (Jippie VFP9 met de nieuwe PictureVal!)

THIS.PictureVal = lcFileHeaderType + lcFileSize + lcFileHeaderReserved1 + lcFileHeaderReserved2 + ;
	lcFileHeaderOffsetBits + lcBitMap

*!* LET OP!!
*!* Twee extra exit-points in deze routine.
Previous
Next
Reply
Map
View

Click here to load this message in the networking platform