Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
VFP9 with Autocad
Message
 
 
To
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:
01450552
Views:
50
Many thanks

Babel Fish has provided a rough translation of the comments

Rob

>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.
>
Rob
Previous
Reply
Map
View

Click here to load this message in the networking platform