A 35mm film camera represented in Python object
Lee Congdon
lee at lcongdon.com
Thu Mar 18 10:55:41 EDT 2021
Note also 36 exposure film.
------------------ Film -------------------------
Speed: 100 ISO
Rewound into cartridge: False
Exposed frames: 0 (of 24)
Ruined: False
On Sun, Mar 7, 2021 at 5:20 AM D.M. Procida <
real-not-anti-spam-address at apple-juice.co.uk> wrote:
> Hi everyone, I've created <https://github.com/evildmp/C-is-for-Camera> -
> a representation of a Canonet G-III QL17 in Python.
>
> There's also documentation: <https://c-is-for-camera.readthedocs.io>.
>
> It's a pure Python model of the physical sub-systems of a camera and
> their interactions. So far it's at a fairly high level - I haven't yet
> got down to the level of individual springs and levers yet.
>
> I spend quite a bit of my time repairing old cameras. To me they feel
> like computer programs encoded into physical objects, and figuring out
> how a mechanism works feels like working out how code works (but more
> fun).
>
> The Canonet G-III QL17 is one of my favourites. One of my reasons for
> writing this code is to appreciate the intricate mechanical logic
> embodied in the machine.
>
> You can do things like advance the film, release the shutter, meter the
> scene with the built-in light meter (if the camera has a battery of
> course) and even spoil your film if you make the mistake of opening the
> back in daylight.
>
> >>> from camera import Camera
> >>> c = Camera()
>
> >>> c.state()
> ================== Camera state =================
>
> ------------------ Controls ---------------------
> Selected speed: 1/120
>
> ------------------ Mechanical -------------------
> Back closed: True
> Lens cap on: False
> Film advance mechanism: False
> Frame counter: 0
> Shutter cocked: False
> Shutter timer: 1/128 seconds
> Iris aperture: ƒ/16
> Camera exposure settings: 15.0 EV
>
> ------------------ Metering ---------------------
> Light meter reading: 4096 cd/m^2
> Exposure target: 15.0 EV
> Mode: Shutter priority
> Battery: 1.44 V
> Film speed: 100 ISO
>
> ------------------ Film -------------------------
> Speed: 100 ISO
> Rewound into cartridge: False
> Exposed frames: 0 (of 24)
> Ruined: False
>
> ------------------ Environment ------------------
> Scene luminosity: 4096 cd/m^2
>
> >>> c.film_advance_mechanism.advance()
> Cocking shutter
> Cocked
>
> >>> c.shutter.trip()
> Shutter opens
> Shutter closes
> Shutter opened for 1/128 seconds
> Shutter uncocked
>
> You can't do impossible things:
>
> >>> c.shutter_speed = 1/33
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> File "/Users/daniele/Repositories/camera/camera.py", line 29, in
> shutter_speed
> raise self.NonExistentShutterSpeed(f"Possible shutter speeds are
> {possible_settings}")
> camera.NonExistentShutterSpeed: Possible shutter speeds are 1/4,
> 1/8, 1/15, 1/30, 1/60, 1/120, 1/240, 1/500
>
> But you can also do things that you shouldn't do, like opening the back
> of the camera in daylight with a partially-exposed roll of film inside -
> which will spoil the film::
>
> >>> c.back.open()
> Opening back
> Resetting frame counter to 0
> 'Film is ruined'
>
> I hope this interesting to someone.
>
> Daniele
> --
> https://mail.python.org/mailman/listinfo/python-list
>
--
+1-202-507-9867, Twitter @lcongdon
More information about the Python-list
mailing list